现在就来解决这个为什么自签名的证书按照网上的步骤加入了可信列表,比如
openssl req -x509 -days 365 -nodes -newkey rsa:4096 \
-keyout selfSignedCert.key \
-out selfSignedCert.pem
cp selfSignedCert.pem /etc/ssl/certs
rehash_ca_certificates.sh
明明这个证书已经加入了可信列表,curl
也没问题了,为什么其他程序比如git
java
还是报错说这是个self-signed证书呢?如果关闭了它们的证书验证就会存在一些风险。那怎么办呢?
那是因为上面证书生成的太简单了…而那个可信列表不是给signed的证书的,而是给Certificate Authority的,就是说是给证书机构的证书的。所以想要在dev环境里让我们self-signed的HTTPS证书可信,必须要先生成Certificate Authority证书,然后用这个证书去签署其他需要的证书。
openssl genrsa -des3 -out rootCA.key 4096
(需要输入一个key的密码)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
(于是我们得到了机构证书,就是传说中的root证书)
(对于每个HTTPS网站证书)
openssl genrsa -out mydomain.company.key 4096
openssl req -new -key mydomain.company.key -out mydomain.company.csr
(填一填表格吧;Common Name最好是填网站域名mydomain.company,因为有些工具会检测这项)
openssl x509 -req -in mydomain.company.csr \
-CA rootCA.crt -CAkey rootCA.key -CAcreateserial \
-out mydomain.company.pem -days 365 -sha256
(这样就签署好了)
剩下的就是比如用这个证书 mydomain.company.pem 和 mydomain.company.key 去配置给nginx,然后在client的系统里把 rootCA.crt 放到ssl/certs里rehash,再curl
npm
mvn
… 就不会有 self-signed 的问题了。
2021:
写完上面的没有问题了,那时还太年轻……
目前的很多app都设置了验证SSL证书的Hostname…比如chrome,你即使有CA,我也不让你访问。
那怎么办呢?
写一个 ssl.conf
的配置文件:
[ req ]
distinguished_name = req_distinguished_name
req_extetions = v3_req
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = ProvinceName
localityName = Locality Name (eg, city)
localityName_default = CityName
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = CompanyName
commonName = primaryDomain # e.g. *.test.com
commonName_max = 64
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.test.com
DNS.2 = wow.test2.com
IP.1 = 127.0.0.1
IP.2 = 192.168.0.100
之后再 openssl req -new -nodes -x509 -keyout ca.key -newkey rsa:4096 -out ca.crt -config ssl.conf -extensions v3_req
这样的话,openssl x509 -text -noout -in ca.crt
就会有Subject Alternative Name
啦;把它放到系统认可的trust列表里,再访问用这个证书保护的网站就不会报错了…