我是一名 Web 开发人员,我使用 Ubuntu 18.04。我的设置是 nginx、php-fpm、mysql。我的机器上运行着多个站点,例如 site1.local、site2.local。
我按照以下说明配置我的本地站点以使用 SSL:https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-18-04。
我成功地配置了它。但我的问题是当我去https://site1.local在谷歌浏览器中,我看到一条警告消息“您的连接不是私密的”:
我必须手动单击“高级”和“继续前往 site1.local(不安全)”。
我的目标是删除此警告消息并立即查看没有此警告的网站。
我已经通过此处启用了我的 chrome,以允许从本地主机加载的资源使用无效证书 chrome://flags/#allow-insecure-localhost
我现在应该怎么做?
答案1
现在大部分浏览器都会在用户访问没有使用 HTTPS 的网站时给出警告,如果这些网站使用了自签名 SSL 证书,则会提示“您的连接不是私密的”,错误代码为“NET::ERR_CERT_AUTHORITY_INVALID”。
购买并安装付费 SSL 证书
为了避免您的网站出现此问题并改善用户体验,您应该安装知名的 SSL 证书,例如您可以从 Name.com、NameCheap.com 或 Godaddy.com 购买的证书。费用从每年 9 美元起,具体取决于您购买的 SSL 证书类型。但我认为在覆盖一个域名时,这是来自 NameCheap.com 的是很棒的。
以下是分步指南来自 NameCheap.com 的介绍,告诉用户如何在 NGINX 上安装 SSL 证书。快来看看吧!
从 Let's Encrypt 获取免费 SSL 证书
如果你不想花钱购买这些付费 SSL 证书,你可以尝试 Let's Encrypt 提供的免费证书。这是一个免费向用户颁发受信任 SSL 证书的组织。
大多数主流网络浏览器都信任此免费 SSL 证书,因此您不会再遇到上述错误。以下是我找到的两篇文章,介绍如何在 NGINX 和 Ubuntu 上使用 Certbot 免费安装 Let's Encrypt SSL 证书。
https://devanswers.co/lets-encrypt-ssl-cert-nginx-ubuntu-18-04/
https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx.html
我是一名 Web 开发人员,我使用 Ubuntu 18.04。我的设置是 nginx、php-fpm、mysql。我的机器上运行着多个网站,例如 site1.local、site2.local。
您需要知道的是,这种类型的 SSL 证书只能验证一个域名。如果您想使用多个域名,则需要使用不同的配置多次安装。例如,如果您的网站同时使用两个域名:domain1.com
和domain2.com
,则需要安装两个 SSL 证书。
如果您仅为 安装 SSL 证书domain1.com
,那么当您通过 加载您的网站时domain2.com
,您将收到此“非私密”错误。
诊断在网站上设置 SSL 证书时出现的问题或查找网络浏览器上的“您的连接不是私密连接”错误,请查看以下文章。
答案2
Chrome 不喜欢自签名证书。
您必须将证书作为根证书导入 Chrome。
答案3
使用包含在您的浏览器/系统信任存储中的 CA 签名的证书。
编辑:根据要求,我添加了一种创建 ca 签名证书的方法,其中包括现在必要的默认扩展和一些相当默认的 openssl 1.1.1 设置,而无需编辑 openssl.cnf 和/或设置“适当的”ca。
创建 ca 密钥和证书:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -extensions v3_ca -key ca.key -days 3652 -out ca.crt -sha256 -subj "/C=CC/ST=Some State/L=Some City/O=Some Organisation/OU=Some Org Unit/CN=Some Chosen CA Name/[email protected]"
-aes256
注意 1:您可能希望使用命令选项加密/密码保护 ca.key genrsa
,否则被盗的 ca.key 可用于签署证书 您的浏览器信任您的 ca 盲目信任
注意 2:您不需要在主题中包含那么多信息,例如-subj "/CN=Some Chosen CA Name"
就足够了
将 ca 证书(ca.crt
)添加到您的浏览器或系统信任库。
创建由您的 CA 签名的证书:
openssl genrsa -out some-example.key 2048
openssl req -new -key some-example.key -sha256 -subj "/C=CC/ST=Some State/L=Some City/O=Some Organisation/OU=Some Org Unit/CN=*.local/[email protected]" | openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -out some-example.crt -days 730 -sha256 -extfile <(echo -e 'basicConstraints=critical,CA:FALSE\nnsCertType=server\nnsComment="OpenSSL Generated Certificate for App Tests"\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid,issuer\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=DNS:*.local,DNS:local,DNS:*.testdomain,DNS:testdomain')
注意 1:您可能不想/不需要包含“Netscape”扩展(ns
生成的 extfile 中以 开头的行),OpenSSL 默认包含 nsComment 并在配置中提示设置 nsCertType,但现在许多证书中都没有设置。
注意 2:现代客户端应仅使用 subjectAltName 进行主题名称验证,这意味着证书主题中的 CN 变为信息性的,证书有效的所有名称(或 IP、OID 等)都应进入 subjectAltName。即使您希望验证仅对单个名称或地址有效,也应使用 subjectAltName。
注意 3:您不需要在主题中包含那么多信息,因此例如-subj "/CN=Some App Test Certifciate"
如果客户端正确使用 SAN 扩展来验证主题就足够了。
local
此示例证书对主机名和testdomain
所有直接子名称(即 app1.local、app2.local、app3.testdomain)有效。
当然,您可以创建证书或仅为您想要的单个主机名创建证书,只要您使用相同的 ca.crt 和 ca.key,它们都可以在信任 ca.crt 的浏览器中工作。