chrome 58 更新

从chrome 58起,chrome已经不接受依赖Common Name的自签名证书。需要使用Subject Alt Name

建立CA

生成 RSA 密钥对

1
$ openssl genrsa -out ca.key 2048

若想对私钥进行加密可以加上 -des3 参数
生成 CA CRT

1
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
Country Name (2 letter code) [XX]:CN # 国家代码
State or Province Name (full name) []:Sichuan # 省份
Locality Name (eg, city) [Default City]:Chengdu # 城市
Organization Name (eg, company) [Default Company Ltd]:sqzr # 组织名称
Organizational Unit Name (eg, section) []:sqzr # 组织单元名称
Common Name (eg, your name or your server’s hostname) []:sqzr # 由此ca签的证书颁发者名
Email Address []:xxx@qq.com

网站csr生成

这里假设需要签的域名为: sqzryang.com
生成 RSA 密钥对

1
$ openssl genrsa -out sqzryang.com.key 2048

生成 csr

1
$ openssl req -new -key sqzryang.com.key -subj "/C=CN/ST=Sichuan/L=Chengdu/O=sqzr/OU=sqzr/CN=sqzryang.com" -sha256 -out sqzryang.com.csr

-subj 可以简化一些证书信息的录入过程.
-sha256 采用sha256加密,openssl默认采用sha1加密,在chrome 41以后已经不将sha1加密的证书标为绿标了。
检查 csr

1
$ openssl req -in sqzryang.com.csr -text

看 Signature Algorithm 是不是 sha256WithRSAEncryption。


利用刚签的ca生成crt

配置文件
写入以下配置文件3.ext:

1
[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = CN
stateOrProvinceName = Sichuan
localityName        = Chengdu
organizationName    = sqzr

[SAN]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = DNS:*.sqzryang.com

生成crt

1
$ openssl x509 -req -days 365 -in sqzryang.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -sha256 -out chinamedcom.crt -extfile 3.ext -extensions SAN

检查crt

1
$ openssl x509 -in sqzryang.com.crt -text

同样是看 Signature Algorithm 是不是sha256WithRSAEncryption


配置双向认证

配置nginx ssl
在nginx配置文件中加入:

1
2
3
ssl on;
ssl_certificate /usr/local/sslca/sqzryang.com.crt;
ssl_certificate_key /usr/local/sslca/sqzryang.com.key;

将自己签的ca加入电脑的信任列表
首先导出ca.crt,在windows上直接双击打开:
证书安装
证书安装
选择添加到受信任的根证书颁发机构
重启chrome,网页已经正常显示绿标了:
显示绿标
配置双向认证
在nginx配置文件中加入:

1
2
ssl_client_certificate /usr/local/sslca/ca.crt;
ssl_verify_client on;

ssl_client_certificate 配置ca的crt地址
生成并安装p12证书

1
$ openssl pkcs12 -export -clcerts -in sqzryang.com.crt -inkey sqzryang.com.key -out sqzryang.com.p12

利用网站的crt and key 来生成,需输入密码
将生成的放到windows,双击安装:
安装p12
将证书安装到个人,并重启chrome.
效果
如果没有导入证书,则会直接提示400错误:
400错误
如果已导入证书,在访问的时候:
导入完成
选择好后就可以直接进入

java信任

浏览器保存了一个常用的 CA 证书列表,在验证证书链的有效性时,直接使用保存的证书里的公钥进行校验,如果在证书列表中没有找到或者找到了但是校验不通过,那么浏览器会警告用户,由用户决定是否继续。与此类似的,操作系统也一样保存有一份可信的证书列表,譬如在 Windows 系统下,你可以运行certmgr.msc 打开证书管理器查看,这些证书实际上是存储在 Windows 的注册表中,一般情况下位于:\SOFTWARE\Microsoft\SystemCertificates\ 路径下。那么在 Java 程序中是如何验证证书的呢?

和浏览器和操作系统类似,Java 在 JRE 的安装目录下也保存了一份默认可信的证书列表,这个列表一般是保存在 $JRE/lib/security/cacerts 文件中。要查看这个文件,可以使用类似 KeyStore Explorer 这样的软件,当然也可以使用 JRE 自带的 keytool 工具(后面再介绍),cacerts 文件的默认密码为changeit

进入jre_home目录 lib\security , 首先查看一下已信任的证书。

1
$ keytool -list -keystore cacerts

然后通过下面的命令,将证书导入到 cacerts 文件中:

1
$ keytool -import -alias sqzryang -keystore cacerts -file ca.crt

然后可以再次查看是否已在列表。