【发布时间】:2018-09-08 05:43:32
【问题描述】:
【问题讨论】:
标签: openssl localhost ssl-certificate self-signed ca
【问题讨论】:
标签: openssl localhost ssl-certificate self-signed ca
tl;dr 生成自己的 CA 颁发的证书(参见下面的脚本)
这是我发现的。纠正我的错误。
有 CA(证书颁发机构)。他们为其他 CA(中间 CA)或服务器(最终实体证书)颁发证书(签署 CSR)。其中一些是根权限。他们有自己签发的自签名证书。也就是说,通常存在从服务器证书到根证书的信任链。而且没有人可以保证根证书。因此,操作系统有一个根证书存储(或信任策略存储),一个系统范围的受信任根证书列表。浏览器有自己的受信任证书列表,其中包括系统范围的列表和用户信任的证书。
在 Chromium 中,您可以在 chrome://settings/certificates 管理证书。在 Firefox 中,Preferences > Privacy & Security > Certificates > View Certificates。两者都有 Authorities 选项卡,这是受信任的根证书的列表。和服务器选项卡,受信任的服务器证书列表。
要获得您创建 CSR(证书签名请求)的证书,请将其发送给 CA。 CA 签署 CSR,在此过程中将其转化为可信证书。
证书和 CSR 是一堆包含信息和公钥的字段。一些字段被称为扩展。 CA 证书是带有basicConstraints = CA:true 的证书。
您可以在 Developer Tools > Security 中检查 Chromium 中的证书错误。
当您更改操作系统的根证书存储时,您必须重新启动浏览器。你改变它:
# trust anchor path/to/cert.crt
# trust anchor --remove path/to/cert.crt
trust 将 CA 证书置于“授权”类别 (trust list) 或“其他条目”类别下。 CA 证书显示在浏览器的“授权”选项卡中,或者显示在“服务器”选项卡中。
与 Chromium 不同,Firefox 不信任来自操作系统根证书存储的服务器证书。两者都信任来自操作系统根证书存储的 CA 证书。
在 Chromium 和 Firefox 中,您可以将证书添加(导入)到 Authorities 选项卡。如果您尝试导入非 CA 证书,则会收到“不是证书颁发机构”消息。选择文件后,会出现一个对话框,您可以在其中指定信任设置(何时信任证书)。使网站正常工作的相关设置是“信任此证书以识别网站”。
在 Chromium 中,您可以在服务器选项卡上添加(导入)证书。但它们最终会出现在“授权”选项卡(CA 证书,选择文件后不会出现信任设置对话框)或“其他”选项卡(如果是非 CA 证书)上。
在 Firefox 中,您无法准确地将证书添加到“服务器”选项卡。您添加例外。而且您可以信任根本没有扩展的证书(差)。
我的系统带有以下证书的默认设置(要添加的扩展):
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
取自/etc/ssl/openssl.cnf,部分v3_ca。更多信息here。
此外,当证书没有 subjectAltName = DNS:$domain 时,Chromium 会认为证书无效。
来自/etc/ssl/openssl.cnf的[ usr_cert ]部分:
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
要让 Chromium 信任自签名证书,它必须具有 basicConstraints = CA:true 和 subjectAltName = DNS:$domain。对于 Firefox 来说,这还不够:
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
Firefox 不需要扩展,但 Chromium 需要 subjectAltName。
openssl备忘单openssl genpkey -algorithm RSA -out "$domain".key - 生成私钥(man)
openssl req -x509 -key "$domain".key -out "$domain".crt - 生成自签名证书(man)
如果没有-subj,它将询问有关专有名称 (DN) 的问题,例如通用名称 (CN)、组织 (O)、位置 (L)。您可以“提前”回答他们:-subj "/CN=$domain/O=$org"。
要添加subjectAltName 扩展,您必须有一个指定所有内容的配置,或者在配置中添加一个部分并使用-extensions 开关告诉openssl 其名称:
-config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
) -extensions x509_ext
openssl req -new -key "$domain".key -out "$domain".csr - 生成CSR,可以带-subj选项(man)
openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
-CA ca.crt -CAkey ca.key -CAcreateserial - 签署 CSR (man)
没有-CAcreateserial 将无法工作。它创建一个ca.srl 文件,其中保存最后生成的证书的序列号。要添加subjectAltName,您需要-extfile 开关:
-extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
)
openssl req -in $domain.csr -text -noout - 查看企业社会责任 (man)
openssl x509 -in $domain.crt -text -noout - 查看证书 (man)
(您需要在 Firefox 中设置一个例外才能正常工作)
#!/usr/bin/env bash
set -eu
org=localhost
domain=localhost
sudo trust anchor --remove "$domain".crt || true
openssl genpkey -algorithm RSA -out "$domain".key
openssl req -x509 -key "$domain".key -out "$domain".crt \
-subj "/CN=$domain/O=$org" \
-config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
) -extensions x509_ext
sudo trust anchor "$domain".crt
#!/usr/bin/env bash
set -eu
org=localhost-ca
domain=localhost
sudo trust anchor --remove ca.crt || true
openssl genpkey -algorithm RSA -out ca.key
openssl req -x509 -key ca.key -out ca.crt \
-subj "/CN=$org/O=$org"
openssl genpkey -algorithm RSA -out "$domain".key
openssl req -new -key "$domain".key -out "$domain".csr \
-subj "/CN=$domain/O=$org"
openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
)
sudo trust anchor ca.crt
Nginx:
server {
listen 443 ssl;
ssl_certificate ssl/localhost.crt;
ssl_certificate_key ssl/localhost.key;
...
莫波:
carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' \
site.pl
附:我正在运行 Chromium 65.0.3325.162、Firefox 59.0 和 openssl-1.1.0.g。
显然,Windows 没有trust 实用程序。在 Windows 下,有two stores:本地机器和当前用户证书存储。使用本地机器证书存储毫无意义,因为我们让它只为我们当前的用户工作。然后,有子商店。其中两个预定义是最受关注的:受信任的根证书颁发机构和中间证书颁发机构存储。在命令行中通常称为root and CA。
您可以通过 chrome://settings/?search=Manage%20certificates 访问 Chrome 的证书管理器,然后点击管理证书。最受关注的是受信任的根证书颁发机构和中间证书颁发机构选项卡。
管理证书的一种方法是通过command line:
>rem list Current User > Trusted Root Certification Authorities store
>certutil.exe -store -user root
>rem list Local Machine > Intermediate Certification Authorities store
>certutil.exe -store -enterprise CA
>rem GUI version of -store command
>certutil.exe -viewstore -user CA
>rem add certificate to Current User > Trusted Root Certification Authorities store
>certutil.exe -addstore -user root path\to\file.crt
>rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
>certutil.exe -delstore -user root 03259fa1
>rem GUI version of -delstore command
>certutil.exe -viewdelstore -user CA
结果如下(本地机器和当前用户证书存储):
root
localhost.crt
error
ca.crt
appears in Trusted Root Certification Authorities tab
CA
localhost.crt
doesn't work, appears in Other People tab
ca.crt
doesn't work, appears in Intermediate Certification Authorities tab
其他选项包括在资源管理器中双击证书、从 Chrome 的证书管理器导入证书、使用证书 MMC 管理单元(运行 certmgr.msc)或使用 CertMgr.exe。
对于那些安装了grep的人,这里是快速检查证书在哪里的方法:
>certutil.exe -store -user root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -user CA | grep "locahost\|^root\|^CA" ^
& certutil.exe -store -enterprise root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -enterprise CA | grep "localhost\|^root\|^CA"
因此,将 CA 证书安装到 Current User > Trusted Root Certification Authorities 存储似乎是最佳选择。并且确保不要忘记restart your browser。
OpenSSL
genpkey
req
x509
OpenSSL Certificate Authority
Certificates for localhost
iamaCA - Become your own certificate authority and dispense certifications
Firefox and Self-Signed Certs
Bypassing certificate error page in Chrome
【讨论】:
easy-rsa 项目。我遇到了设置 OpenVPN 的问题。它必须简化成为 CA(特别是创建 CA 和服务器证书)。不过没试过。
在 chrome 上,可以浏览到 chrome://flags/#allow-insecure-localhost 并启用
允许从 localhost 加载的资源使用无效证书。 选项
【讨论】:
在您的浏览器中打开此链接并启用它: chrome://flags/#temporary-unexpire-flags-m87
然后重新启动chrome并搜索localhost,你会在那里找到它。
【讨论】: