0. 准备
提炼一下:
1、生成密钥库(客户端,服务端,根证书),如果有中间证书,有几个建几个就OK了
2、制作证书链,先生成证书请求,然后让上级证书签发,生成证书文件。然后将这个证书链的相关证书文件,从根到终端,逐个导入到一个文件里。
提示:推荐博客写的很棒,读不懂,多读几遍,动动手。就会豁然开朗。我也遇到了个问题,在文末记录可以参考。
说明:以下在同一个目录下操作完成,配置双向认证先执行单向认证命令为前提。
keytool为java原生自带,安装java后不需要再进行安装,作为密钥和证书管理工具,方便用户能够管理自己的公钥/私钥及证书,用于认证服务。
1.生成密钥库
# 生成根证书仓库文件
keytool -genkeypair -alias ca -keyalg RSA -keystore ca.keystore -storepass 123456 -dname "CN=rootCA, OU=huawei, O=huawei, L=beijing, ST=beijing, C=cn"
# 生成服务器证书仓库文件
keytool -genkeypair -alias server -keyalg RSA -keystore server.keystore -storepass 123456 -dname "CN=服务器IP, OU=huawei, O=huawei, L=beijing, ST=beijing, C=cn" -ext san=ip:服务器IP
# 生成客户端证书仓库文件(单向认证可以不生成,用不到该文件)
keytool -genkeypair -alias client -keyalg RSA -keystore client.keystore -storepass 123456 -dname "CN=客户端IP, OU=huawei, O=huawei, L=beijing, ST=beijing, C=cn" -ext san=ip:客户端IP
2.单向认证
2.1 生成服务器证书
# 生成服务端证书请求
keytool -certreq -alias server -keystore server.keystore -storepass 123456 -file server.csr
# 创建ca根证书并签发服务端证书请求,生成服务端证书
keytool -gencert -alias ca -keystore ca.keystore -storepass 123456 -infile server.csr -outfile server.cer
# 导出ca根证书
keytool -exportcert -alias ca -keystore ca.keystore -storepass 123456 -file ca.cer
# ca根证书导入到服务端证书仓库
keytool -importcert -alias ca -keystore server.keystore -storepass 123456 -file ca.cer
# 服务端证书导入到服务端证书仓库
keytool -importcert -alias server -keystore server.keystore -storepass 123456 -file server.cer
# 查看证书仓库详细信息
keytool -list -keystore server.keystore -storepass 123456 -v
2.2 Tomcat配置数字证书
1、将文件 server.keystore 放到 ${TOMCAT_HOME}/ssl 文件夹中,如果没有就创建一个。
2、修改文件 ${TOMCAT_HOME}/conf/server.xml
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="1150" SSLEnabled="true" scheme="https" secure="true"
sslProtocol="TLS"
clientAuth="false"
keystoreFile="ssl/server.keystore"
keystorePass="123456"
ciphers="TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"/>
3、启动Tomcat
2.3 客户端安装根证书
1、找到文件 ca.cer 位置,双击 》存储位置:本地计算机 》下一页 》安装证书 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 受信任的根证书颁发机构 》确定 》下一页 》完成
2.4 访问Tomcat
证书已经生效,点击继续前往,即可访问Tomcat首页。(错误提示分析见文末)
3. 双向认证
3.1 生成客户端证书
# 导出客户端自签证书(公钥),用于服务端证书信任
keytool -exportcert -alias client -keystore client.keystore -storepass 123456 -file client.cer
# 将密钥库 client.keystore 导入到 client.p12 。 用于客户端证书导入到windows系统,以证明客户端身份
keytool -importkeystore -srckeystore client.keystore -destkeystore client.p12 -srcalias client -destalias client -srcstoretype jks -deststoretype pkcs12 -noprompt
# 客户端证书导入到服务端证书仓库
keytool -importcert -alias client -keystore server.keystore -storepass 123456 -file client.cer
# 查看服务器证书仓库详细信息
keytool -list -keystore server.keystore -storepass 123456 -v
# 查看客户端证书仓库详细信息
keytool -list -keystore client.keystore -storepass 123456 -v
# 查看客户端证书仓库详细信息
keytool -list -keystore client.p12 -storepass 123456 -v
2.2 Tomcat配置数字证书
1、将文件 server.keystore 放到 ${TOMCAT_HOME}/ssl 文件夹中,如果没有就创建一个。单向认证的文件如果存在,直接覆盖掉。
2、修改文件 ${TOMCAT_HOME}/conf/server.xml
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="1150" SSLEnabled="true" scheme="https" secure="true"
sslProtocol="TLS"
clientAuth="true"
keystoreFile="ssl/server.keystore"
keystorePass="123456"
truststoreFile="ssl/server.keystore"
truststorePass="123456"
ciphers="TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />
3、启动Tomcat。(注意:启动前查看Tomca进程 ps aux | grep tomcat
,保证Tomcat没有启动,否则启动多个Tomcat可能导致配置不生效)
2.3 客户端安装根证书
1、打开Chrome 》设置 》隐私设置和安全性 》安全 》高级:管理证书 》弹出 证书 窗口
3、证书 窗口 》个人 》导入 》弹出 证书导入向导
4、证书导入向导 窗口 》下一页 》浏览 找到文件 client.p12
目录,右下角格式选择 个人信息交换(*.pfx;*.p12)
》选择 client.p12
》下一页
5、为私钥键入密码:123456 》下一页 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 个人 》确定 》下一页 》完成
2.4 访问Tomcat
1、访问 https://服务器IP/
2、您的连接不是私密连接 》继续前往
3、选择证书,以证明个人身份,确定。即可成功访问Tomcat主页
遇到问题
问题1: 按照博客做出来的证书,提示该证书有一个无效的数字签名
原因: eytool生成密钥对默认使用的密钥算法是 DSA 导致。仔细查看博客中的证书详细信息,虽然作者没有指定密钥算法,但证书的密钥算法是RSA
解决方法: 成密钥对时添加选项 -keyalg RSA
指定密钥算法即可。
问题2:您的连接不是私密连接
NET::ERR_CERT_COMMON_NAME_INVALID
此服务器无法证实它就是 xxx.xxx.xxx.xxx - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。
原因: 生成证书的时候没有加上备用名称字段,目前的浏览器校验证书都需要这个字段。
解决方法: 创建密钥库时,增加额外信息 -ext san=dns:localhost:127.0.0.1
我们使用keytool -ext选项来设置 Subject Alternative Names (SAN),以定义识别服务器的本地主机名/IP地址。一般来说,我们可以用这个选项指定多个地址。然而,客户将被限制在使用这些地址中的一个来连接到服务器。
结论: 额外信息虽然添加参数添加上了,但是生成的证书的详情信息中并没有看到。目前还没有找到其他解决方法。
问题3:此网站无法提供安全连接
xxx.xxx.xxx.xxx 不接受您的登录证书,或者您可能没有提供登录证书。
- 请尝试联系系统管理员。 ERR_BAD_SSL_CLIENT_AUTH_CERT
原因1: Tomcat配置文件没有生效
解决方法: 核对配置信息。重新启动Tomcat
原因2: 客户端的个人证书没有导入成功,或者浏览器存在缓存
解决方法: 导入后确认浏览器证书,个人 标签下面有对应的数字证书。清除浏览器cookie等缓存重启浏览器。