1. 使用XCA制作数字证书
1.1 跟着博客做
用XCA创建管理证书,这4篇大佬博客写的很详细,推荐看看。
博客里的下载地址不太直接,建议从这里下载。XCA工具下载地址
用XCA可视化程序管理SSL 证书(2)--生成SSL证书请求
用XCA可视化程序管理SSL 证书(3)--创建自定义的凭证管理中心(Certificate Authority)
用XCA可视化程序管理SSL 证书(4)--用自定义的凭证管理中心(Certificate Authority)签名证书请求
一些常见的证书文件类型如下:
X.509#DER 二进制格式证书,常用后缀.cer .crt X.509#PEM 文本格式证书,常用后缀.pem 有的证书内容是只包含公钥(服务器的公钥),如.crt、.cer、.pem 有的证书既包含公钥又包含私钥(服务器的私钥),如.pfx、.p12
1.2 跟着XCA使用手册做
1.2.1 XCA - X Certificate and Key management
直接阅读【Step by Step guides】部分跟着做也可
1.2.2 XCA - X 证书和密钥管理
直接阅读【分步指南】部分跟着做也可
1.3 我的实践
问:为何要创建根CA证书并签发终端证书的方式来实践,而不是直接创建一个自签证书?
答:①网站大多都是通过正规渠道向权威的CA申请自己网站所需的证书(非根证书); ②自签证书没有吊销操作。
问:证书签名请求和证书的区别?
答:证书签名请求用于在不知道私钥的情况下向证书颁发机构提供颁发有效证书所需的信息,包括个人信息、公钥和其他扩展。 简而言之,缺少签名信息的证书被叫做证书签名请求。直接创建一个证书,必须需要指定当前创建的证书是自签的还是由其他CA证书签发的。如果当前创建的证书需要一个CA证书签发,但又没有这个证书,你就无法创建证书了。这时候,可以通过创建证书签名请求,把除了签名的其他信息全部填好,生成出来。把签名留到最后一步做就可以了,签名后的证书签名请求就是一个完整的证书了。
1.3.1 创建数字证书仓库
文件 》新建数据库 》选择数据库文件保存在本地的位置,并指定文件名称 》设置数据库文件密码(不设置就空白即可)》ok
1.3.2 创建CA根证书
-
单击 证书 选项卡。
-
单击 创建证书 按钮。
-
单击 “来源” 选项卡 》签名:创建自签名证书 》签名算法:SHA 1 》使用模板创建新证书:[default] TLS_server》应用模板所有信息
-
单击 “主体” 选项卡
-
单击 “扩展” 选项卡
-
单击 “OK” 按钮,弹出警告框,提示“来源”选项卡中的签名算法是不安全的,最好别用这个算法。本次实践不考虑算法安全问题, 用即可。现网中就不要这样做了,不安全。
1.3.3 创建服务端证书
-
单击 证书 选项卡。
-
单击 创建证书 按钮。
-
单击 “来源” 选项卡 》签名:使用此CA证书进行签名-huaweiCA 》签名算法:SHA 1 》使用模板创建新证书:[default] TLS_server》应用模板所有信息
-
单击 “主体” 选项卡 》填写 Distinguished name 区域信息(commonName填写服务器FQDN或IP)》生成新密钥
-
单击 “扩展” 选项卡 》
①类型:最终实体
②有效期和时间跨度默认1年,可以自定义,但自定义之后一定要点击“应用”,否则不会生效
③X5T09v3 Subject Alternative Name 》编辑(因为我没有申请域名,所以直接使用IP,添加的类型就是IP,具体情况请结合实际)
-
单击 “OK” 按钮 》Use algorithm anyway 》成功创建证书
5.3.4 创建客户端证书
-
单击 证书 选项卡。
-
单击 创建证书 按钮。
-
单击 “来源” 选项卡 》签名:使用此CA证书进行签名-huaweiCA 》签名算法:SHA 1 》使用模板创建新证书:[default] TLS_client 》应用模板所有信息
-
单击 “主体” 选项卡 》填写 Distinguished name 区域信息(commonName填写客户端FQDN或IP)》生成新密钥
-
单击 “扩展” 选项卡 》
①类型:最终实体
②有效期和时间跨度默认1年,可以自定义,但自定义之后一定要点击“应用”,否则不会生效
③X5T09v3 Subject Alternative Name 》编辑 》添加 》类型=IP,内容=客户端IP
-
单击 “OK” 按钮 》Use algorithm anyway 》成功创建证书
2. 配置数字证书- 单向认证
单向认证:只对通信某一方的身份合法性进行认证,例如在web应用中客户端在与服务端进行通信的时候,只要求对服务端的身份进行认证(这就要求服务端必须有一个CA证书,以供检验)。
单向认证原因:用户数目广泛,且无需在通讯层对用户身份进行验证,一般都是在应用逻辑层保证用户的合法登入。
服务端环境:centOS 7 + Tomcat。Tomcat服务器支持安装PFX格式和JKS(java key store)两种格式的证书。
JKS(java key store)是JAVA的keytools证书工具支持的证书私钥格式。
XCA 工具导出的格式没有JKS,所以我们将“Server证书”导出 为 PFX格式即可。
客户端环境:Windows 10 + Chrome。
第一步,服务端Tomcat配置PFX格式的Server证书
1、从XCA中将Server证书以 PKCS #12 (*.pfx) 格式导出,Server证书与根证书huaweiCA中间没有交叉证书,所以不用导出证书链格式的pfx。导出时输入的密码,一定要记住了。
2、将导出的数字证书文件Server.pfx,上传到服务的 ${Tomcat_Home}/ssl 文件夹中,没有ssl就创建一个。其他位置也行,你自己记住就可以。
3、打开${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.pfx"
keystorePass="导出时输入的密码"
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"/>
4、重启Tomcat,使配置文件生效。
第二步,客户端Chrome导入根证书huaweiCA
1、从XCA中将huaweiCA证书以PEM (*.crt)格式导出。
2、打开Chrome 》设置 》隐私设置和安全性 》安全 》高级:管理证书 》弹出 证书 窗口
3、证书 窗口 》受信任的根证书颁发机构 》导入 》弹出 证书导入向导
4、证书导入向导 窗口 》下一页 》浏览 选择刚刚导出的证书文件 huaweiCA.crt 》下一页 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 受信任的根证书颁发机构 》确定 》下一页 》完成
5、弹出 安全警告 窗口 》是 》导入成功
6、证书 窗口 》受信任的根证书颁发机构 列表 就可以看到数字证书 huaweiCA 了 》关闭 证书 窗口
第三步,访问网站
1、Chrome 访问 https://服务器IP/ 。(服务器要开放端口443哦)。
访问这个网站还是会提示"您的连接不是私密连接"。根据提示信息显示,是因为网站配置的证书的签名算法是SHA-1,而目前SHA-1是不安全的所以提示了。
解决方法:①点击继续前往。只是签名算法不安全,不影响抓包和分析。 ②根据服务器证书制作方法,制作一个签名算法安全的证书,重新部署一下,就没有这个报警提示了。亲自测试过。
3、成功访问Tomcat首页后。证书配置成功
3. 配置数字证书 - 双向认证(遇到问题待解决)
双向认证:要求通信双方要相互验证身份,要求通信双方都要有CA证书。例如在企业的应用服务之间存在调用关系的时候,情况就不一样了,可能需要对通信双方做身份验证。这个时候就是要SSL双向认证了。
说明:操作环境与单向认证操作环境一致。单向认证实现的是客户端验证服务端。双向认证是在单向认证的基础上,还要服务端验证客户端。所以先配置单向认证,然后跟着下面的步骤,实现服务端验证客户端。
第一步,客户端(windows 10)安装客户端证书
1、从XCA中将Client证书以DER (*.cer)格式导出。
2、打开文件 Client.cer 》弹出证书安装窗口 》安装证书 》存储位置:本地计算机 》下一页 》选择 将所有的证书都放入下列存储 》证书存储:浏览 》选择 个人 》确定 》下一页 》完成
第二步,服务端Tomcat配置信任客户端的Client.cer数字证书的根证书
由于根证书huaweiCA,不仅签发了服务端证书,还签发了客户端证书,所以服务端配置信任客户端的Client.cer数字证书的根证书还是huaweiCA。
如果客户端的证书是由其他CA签发的,则需要配置签发客户端证书的CA。
1、导出服务端信任客户端的证书,从XCA中将huaweiCA证书以格式 PKCS #12 (*.pfx) 导出。导出时输入的密码,一定要记住了。
2、将导出的数字证书文件huaweiCA.pfx,上传到服务的 ${Tomcat_Home}/ssl 文件夹中,没有ssl就创建一个。其他位置也行,你自己记住就可以。
3、打开${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.pfx"
keystorePass="导出时输入的密码"
truststoreFile="ssl/huaweiCA.pfx"
truststorePass="导出时输入的密码"
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"/>
<!--
属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书
truststorePass:根证书密码
-->
从XCA中将Server证书以PFX格式导出,Server证书与根证书huaweiCA中间没有交叉证书,所以不用导出证书链格式的pfx。导出时输入的密码,一定要记住了。
配置双向认证时,出现问题了。Tomcat启动报错。查询了很多资料。没有找到问题出现的原因。后续处理吧,欢迎大佬指教。
以下是报错信息。
24-Sep-2022 10:14:09.005 警告 [main] org.apache.coyote.http11.Http11Protocol.<init> The HTTP BIO connector has been removed in Tomcat 8.1.x onwards. The HTTP BIO connector configuration has been automatically switched to use the HTTP NIO connector instead.
24-Sep-2022 10:14:09.070 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/8.5.82
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Aug 8 2022 21:26:07 UTC
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 8.5.82.0
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Java\jdk_1.8.0_342\jre
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_342-b07
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Amazon.com Inc.
24-Sep-2022 10:14:09.071 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\apache-tomcat-8.5.82
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\apache-tomcat-8.5.82
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=D:\apache-tomcat-8.5.82\conf\logging.properties
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
24-Sep-2022 10:14:09.072 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs=
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=D:\apache-tomcat-8.5.82
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=D:\apache-tomcat-8.5.82
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=D:\apache-tomcat-8.5.82\temp
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.0]加载了基于APR的Apache Tomcat本机库[1.2.35]。
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [{4}]。
24-Sep-2022 10:14:09.073 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true]
24-Sep-2022 10:14:09.081 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 1.1.1q 5 Jul 2022]
24-Sep-2022 10:14:09.147 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"]
24-Sep-2022 10:14:09.161 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["https-openssl-nio-443"]
24-Sep-2022 10:14:09.453 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11Protocol-443]]
org.apache.catalina.LifecycleException: 协议处理程序初始化失败
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1115)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:571)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:874)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
at org.apache.catalina.startup.Catalina.load(Catalina.java:646)
at org.apache.catalina.startup.Catalina.load(Catalina.java:669)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:305)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
Caused by: java.lang.IllegalArgumentException: the trustAnchors parameter must be non-empty
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:108)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:72)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:206)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1221)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1234)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:230)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:633)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1112)
... 13 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:157)
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:130)
at org.apache.tomcat.util.net.SSLUtilBase.getParameters(SSLUtilBase.java:502)
at org.apache.tomcat.util.net.SSLUtilBase.getTrustManagers(SSLUtilBase.java:433)
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:106)
... 21 more
24-Sep-2022 10:14:09.454 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 708 ms
24-Sep-2022 10:14:09.482 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina]
24-Sep-2022 10:14:09.482 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/8.5.82]
24-Sep-2022 10:14:09.490 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.82\webapps\docs]
24-Sep-2022 10:14:09.650 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.82\webapps\docs]的部署已在[159]毫秒内完成
24-Sep-2022 10:14:09.651 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.82\webapps\examples]
24-Sep-2022 10:14:09.899 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.82\webapps\examples]的部署已在[247]毫秒内完成
24-Sep-2022 10:14:09.899 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.82\webapps\host-manager]
24-Sep-2022 10:14:09.922 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.82\webapps\host-manager]的部署已在[23]毫秒内完成
24-Sep-2022 10:14:09.922 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.82\webapps\manager]
24-Sep-2022 10:14:09.945 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.82\webapps\manager]的部署已在[23]毫秒内完成
24-Sep-2022 10:14:09.945 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.82\webapps\ROOT]
24-Sep-2022 10:14:09.961 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.82\webapps\ROOT]的部署已在[16]毫秒内完成
24-Sep-2022 10:14:09.963 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
24-Sep-2022 10:14:09.979 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 522 ms
第三步,访问网站
待完成