HTTPS与数字证书(4)-keytool制作证书并配置

548 阅读5分钟

0. 准备

推荐博客keytool命令制作CA根证书,签发二级证书

提炼一下:

1、生成密钥库(客户端,服务端,根证书),如果有中间证书,有几个建几个就OK了

2、制作证书链,先生成证书请求,然后让上级证书签发,生成证书文件。然后将这个证书链的相关证书文件,从根到终端,逐个导入到一个文件里。

提示:推荐博客写的很棒,读不懂,多读几遍,动动手。就会豁然开朗。我也遇到了个问题,在文末记录可以参考。

说明:以下在同一个目录下操作完成,配置双向认证先执行单向认证命令为前提。

keytool为java原生自带,安装java后不需要再进行安装,作为密钥和证书管理工具,方便用户能够管理自己的公钥/私钥及证书,用于认证服务。

keytool-帮助文档

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"/>

image-20220927193643987.png

3、启动Tomcat

2.3 客户端安装根证书

1、找到文件 ca.cer 位置,双击 》存储位置:本地计算机 》下一页 》安装证书 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 受信任的根证书颁发机构 》确定 》下一页 》完成

2.4 访问Tomcat

访问 https://服务器IP/

证书已经生效,点击继续前往,即可访问Tomcat首页。(错误提示分析见文末)

image-20220928165943254.png

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" />

image-20220927200329662.png

3、启动Tomcat。(注意:启动前查看Tomca进程 ps aux | grep tomcat ,保证Tomcat没有启动,否则启动多个Tomcat可能导致配置不生效)

2.3 客户端安装根证书

1、打开Chrome 》设置 》隐私设置和安全性 》安全 》高级:管理证书 》弹出 证书 窗口

3、证书 窗口 》个人 》导入 》弹出 证书导入向导

4、证书导入向导 窗口 》下一页 》浏览 找到文件 client.p12 目录,右下角格式选择 个人信息交换(*.pfx;*.p12) 》选择 client.p12 》下一页

5、为私钥键入密码:123456 》下一页 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 个人 》确定 》下一页 》完成 image-20220927201916979.png

2.4 访问Tomcat

1、访问 https://服务器IP/

2、您的连接不是私密连接 》继续前往

3、选择证书,以证明个人身份,确定。即可成功访问Tomcat主页 image-20220928093359902.png

遇到问题

问题1: 按照博客做出来的证书,提示该证书有一个无效的数字签名

原因: eytool生成密钥对默认使用的密钥算法是 DSA 导致。仔细查看博客中的证书详细信息,虽然作者没有指定密钥算法,但证书的密钥算法是RSA

解决方法: 成密钥对时添加选项 -keyalg RSA 指定密钥算法即可。 image.png

问题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等缓存重启浏览器。