一、准备
首先你要有个服务器,服务器上要有JDK和Tomcat,JDK和Tomcat的安装请自行百度,这里不赘述。
我的JDK版本为1.8.0_311
,Tomcat版本为10.0.14
,其他版本请自行验证。配置中我全程使用的是root用户,如果你用的是其他用户,请注意相应的Linux权限问题。因为我用的是java的keytool工具,所以Windows生成证书的命令跟Linux的命令一样,与操作系统无关。
二、为服务器生成自签证书(单双向认证都需要)
1.在/opt目录下创建ca文件夹
目的:方便证书管理,具体放在哪个文件夹没有硬性要求,放在/opt文件夹下是我个人的习惯。
命令:
(1)移动到/opt文件夹: cd /opt
(2)创建ca文件夹:mkdir ca
截图:
2.创建服务器证书(keystore格式)
命令:
(1)移动到刚刚创建的ca文件夹下:cd /opt/ca
(2)利用Java自带的keytool工具创建服务器证书:keytool -genkey -v -alias tomcat -keyalg RSA -ext SAN=ip:82.156.193.157 -validity 365000 -keystore tomcat.keystore
命令参数说明:
-genkey
:在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书。
-v
:显示密钥库中的证书详细信息
-alias
:设置证书别名,设置后会替代默认的mykey。
-keyalg
:设置秘钥算法。
-ext
:扩展,可以设置域名信息与内外网地址。如果是IP方式访问用-ext SAN=ip:你的IP
,如果是域名用-ext SAN=dns:你的域名
-validity
:设置证书有效期,最大为9999年。
-keystore
:指定密钥和证书库,如果是放到Windows系统的C盘,需要管理员权限。
截图:
三、为客户端生成自签证书(仅双向认证需要,单向认证可忽略)
1.创建客户端证书(p12格式)
目的:HTTPS比HTTP协议安全的主要原因就是HTTPS比HTTP多了证书验证这一步,阻止了中间人攻击。HTTPS的认证方式有两种,一是单向认证,二是双向认证。对于安全性要求不高的系统,采用单向认证就足够了,也就是客户端认证服务器端。但是如果想使系统安全性更高,我们就需要利用客户端证书来实现双向认证。
命令:
(1)利用Java自带的keytool工具创建客户端证书:keytool -genkey -v -alias client -keyalg RSA -validity 365000 -storetype PKCS12 -keystore client.p12
参数说明:
-genkey
:在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书。
-v
:显示密钥库中的证书详细信息
-alias
:设置证书别名。
-keyalg
:设置秘钥算法。
-validity
:设置证书有效期,最大为9999年。
-storetype
:设置密钥库的类型
-keystore
:指定密钥库,如果是放到Windows系统的C盘,需要管理员权限。
截图:
2.将p12格式的客户端证书转换为cer格式
目的:p12格式的证书无法直接导入客户端证书(tomcat.keystore)中,需要先转换成cer格式。
命令:
(1)p12格式转cer格式:keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
参数说明:
-export
:导出证书
-alias
:设置别名
-keystore
:指定源证书的路径与名称
-storetype
:指定源证书的类型
-storepass
:验证源证书的密码
-rfc
:将以可打印的编码格式输出证书
-file
:指定目标证书的路径、文件名和类型
截图:
四、将客户端证书导入服务器证书中(仅双向认证需要,单向认证可忽略)
1.客户端证书导入服务器证书
目的:服务器端认证客户端证书。
命令:
(1)将客户端证书导入服务器证书中:keytool -import -v -file client.cer -keystore tomcat.keystore
参数说明:
-import
:导入证书
-v
:显示密钥库中的证书详细信息
-file
:填写被导入证书的路径与文件名,此处为客户端证书
-keystore
:填写目标证书的路径与文件名,此处为服务器端证书
截图:
2.查看导入情况
目的:验证证书导入情况
命令:
(1)在屏幕打印证书详情:keytool -list -keystore tomcat.keystore
证书信息说明:由于在导入时没有给客户端证书设置别名,因此客户端证书别名默认为mykey
截图:
五、Tomcat配置服务器端证书(单双向认证都需要)
目的:通过配置Tomcat的server.xml文件,让Tomcat能够解析服务器证书。其他服务器配置证书的方式请自行百度。
操作步骤:
(1)将以下代码加入到Tomcat的server.xml文件中,注意Tomcat 8、9和Tomcat 10的添加写法不一样。配置项“clientAuth”设置为false,即可关闭Tomcat验证
<!-- Tomcat 8、9添加证书 -->
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="/opt/ca/tomcat.keystore"
keystorePass="123456"
clientAuth="false"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"
truststoreFile="/opt/tomcat.keystore"
truststorePass="123456"
/>
<!-- Connector参数说明:
Connector参数我只写了我需要的那部分,Connector参数还有很多,具体参数介绍请直接看Tomcat 9的官方说明:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html -->
<!-- Tomcat 10添加证书 -->
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443"
clientAuth="false"
SSLEnabled="true">
<SSLHostConfig>
<Certificate
certificateKeystoreFile="/opt/ca/tomcat.keystore"
certificateKeystorePassword="123456"
type="RSA"
/>
</SSLHostConfig>
</Connector>
<!-- Connector参数说明:
Connector参数我只写了我需要的那部分,Connector参数还有很多,具体参数介绍请直接看Tomcat10 的官网说明:https://tomcat.apache.org/tomcat-10.0-doc/ssl-howto.html#Configuration -->
六、客户端安装服务器证书(单双向认证都需要)
1.将服务器证书keystore转为cer格式
目的:cer格式便于在浏览器、Windows系统、iis证书安装,便于用Hbuilder打包安卓APP等(Hbuilder直接用keystore就行) 。
命令:
(1)keytool -keystore tomcat.keystore -export -alias tomcat -file server.cer
参数说明:可以参考客户端p12格式转cer格式
截图:
2.浏览器、Windows安装服务器证书
这里以Chrome浏览器为例,edge、火狐、360、2435、QQ等浏览器通用,IE浏览器配置方法请自行百度。
(1)复制服务器证书到客户端。我用的是WinSCP将服务器端证书(server.cer)下载到客户端电脑上的。
(2)双击服务器证书文件(server.cer),点击安装证书。
(3)选择安装证书到当前用户,或全部用户,这里我选择安装给这台电脑上的全部用户
(4)选择证书存储位置,这里要选择“受信任的根证书颁发机构”
(5)完成安装
七、验证奇迹的时刻(客户端成功单向认证服务器!)
打开浏览器,利用HTTPS访问Tomcat服务器的示例项目,可以看到已经实现了HTTPS连接,单向认证已经实现。
截图:
八、验证究极奇迹的时刻(客户端与服务器双向认证!)
百亿须弥山,百亿日月,名为三千大千世界。这世界里有多少种服务器,我们无从得知。每种服务器又有多少种配置我们也无从得知。所以我只介绍四款主流服务器的客户端认证配置项。
文章尚未完成,最后更新日期为:2022-01-19 10:46:50