在Windows下编译OpenSSL,并使用编译出来的OpenSSL应用生成CA证书和服务端签名,并在Tomcat中应用。
文章目录
1. 概述
本人之前专门创建了一台虚拟机用来编译Nginx(Nginx技巧之Windows下编译),因此编译OpenSSL所需要的VS,Perl等都已经安装到位了,因此笔者决定走自编译的路线。对于直接安装感兴趣的可以参见 - openssl安装包 - 方便安装。
所以我们先把本次将要完成的操作总结一下:
- 编译OpenSSL
- 使用编译出来的OpenSSL 自签发 CA 根证书
- 使用自签发的CA根证书为相应的服务端签发证书
- 客户端直接导入签发服务器证书的CA自签证书,本次不进行双向认证。
2. 编译OpenSSL
-
将openssl源码解压,推荐放到一个根目录下。例如:
c:\openssl-1.0.1u
。 -
打开VS命令行工具,这里千万要注意版本号,一定要跟你想要编译的OpenSSL版本号一致;例如下图表明我们需要编译的是64位版本的OpenSSL。
-
在上面打开的控制台中执行如下命令:
# 切换到OpenSSL根目录 cd c:\openssl-1.0.1u # 我这里是编译64位的 perl Configure VC-WIN64A no-asm --prefix=C:\openssl-1.0.1u\win64 # 添加环境变量 set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\ # 执行 ms\do_nasm # 执行 ms\do_win64a # 再设置一次环境变量, 这里应该是非必须的, 但笔者在编译过程中出现过命令未找到, 为了更高的成功率, 就多执行一次吧 cd "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64" vcvars64.bat # 再次切换回openssl目录 cd C:\openssl-1.0.1u # 执行完后会在openssl-1.0.1u目录下生成out32和tmp32两个文件夹, # 1. out32文件夹中会生成两个静态库和一些执行文件, # 2. tmp32文件夹中会生成相应的汇编文件。 # 此处为静态编译 # 如果出现类似错误:"error A2088:END directive required at end of file", 只需要打开相应的文件, 在其中输入字符串"END"即可。 nmake -f ms\nt.mak # 检查上一步编译是否成功,如果成功则最后显示“passed all tests”字样 nmake -f ms\nt.mak test # 执行 # 成功则会在openssl-1.0.1u\win64目录下生成bin、include、lib、ssl四个文件夹 nmake -f ms\nt.mak install # 将 openssl-1.0.1u\win64 加入环境变量中 # 这句可能执行失败, 那就老老实实走界面化操作吧 setx path "%path%;c:\openssl-1.0.1u\win64" # 查看openssl是否可用 openssl version
3. 使用OpenSSL生成ca及证书
在编译出可用的OpenSSL之后,接下来我们来进行SSL的证书签发操作。
3.1 产生自己的CA
SSL在身份认证过程中需要有一个双方都信任的CA签发的证书,CA签发证书是需要收费的,这里我们自己产生一个CA,然后用自己产生的CA签发证书。
-
首先准备好配置文件
openssl.cnf
,关注如下几个配置项:[ CA_default ] # 临时文件存放的根目录, 例如下面的index.txt等等 dir = E:/CA_workspace/CA # Where everything is kept # 以下文件夹和文件需要自己手动创建 new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial [ v3_req ] subjectAltName = @alt_names # 这里设置私钥里的使用者名称, 否则Chrome报错 [ alt_names ] #DNS.1 = 150.40.16.161 IP.1 = 10.14.124.50
-
生成CA 根证书和根密钥
cd E:\2-CA\openssl # -nodes 密钥文件不加密, 避免输入密码 # -x509 表示该条命令将产生自签名的证书 openssl req -newkey rsa:2048 -x509 -days 5480 -keyout root.key -out root.crt -config openssl.cnf -nodes
以上,将在当前目录下生成CA根证书和密钥,即root.crt
和root.key
两文件。
3.2 使用自己产生的CA为server签发证书
# 1. 生成证书的key文件
openssl genrsa -aes256 -out secure.key 2048
openssl rsa -in secure.key -out localhost.key
# 2. 生成证书请求文件
openssl req -new -key localhost.key -out localhost.csr -config openssl.cnf
# take a look at what the csr contains, 主要是看我们在配置的[alt_names]是否生效
openssl req -text -noout -in localhost.csr
# 3. 生成证书文件
openssl ca -in localhost.csr -out localhost.crt -cert root.crt -keyfile root.key -extensions v3_req -config openssl.cnf -create_serial
以上命令执行完,应该在操作目录下生成了localhost.crt
和 localhost.key
文件。这就是我们在配置Tomcat时要使用到的。
3.2.1 持续集成版本
以下命令执行时无需确认操作,可用于CICD。
# 1. 生成服务端证书请求文件csr, 以及私钥
# "-x509"选项和"-new"或"-newkey"配合使用时,可以不指定证书请求文件,它在自签署过程中将在内存中自动创建证书请求文件
# 使用"-x509"选项后,"-new"或"-newkey"将表示创建一个证书文件而不是一个证书请求文件。
# "-newkey"选项和"-new"选项类似,只不过"-newkey"选项可以直接指定私钥的算法和长度,所以它主要用在openssl req自动创建私钥时。
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config openssl.cnf -subj "/C=CN/ST=hubei/O=kanq/OU=kanq/CN=kanq-%1/emailAddress=tianjixiang@kqgeo.com"
# 2. 对上面的服务端证书请求文件csr进行CA签署
# 其中输入为client.crt, client.key, openssl.cnf;;; 输出为server.crt
openssl ca -in server.csr -out server.crt -cert client.crt -keyfile client.key -extensions v3_req -config openssl.cnf -batch
3.3 使用自己产生的CA为client签发证书
- 如无需实现双向认证,则无需准备客户端的东东。
- 客户端只需要导入签发服务器证书的CA自签证书即可。
- 按照本次的需求, 这一步先省略。
4. Tomcat配置和客户端证书的导入
客户端证书的导入,直接双击执行上面的root.csr
即可。而Tomcat的配置则是在${CATALINA.BASE}/conf/server.xml
文件中
<!--注释掉原有的8080Connector, 启用下图这个, 注意protocol中的类型为 Apr -->
<!-- 根据途中的配置的路径可知, 需要将两个文件拷贝到tomcat的 conf/ssl 目录下-->
<!-- 如果启动时报 APR/native library 缺失, 则可去 http://tomcat.apache.org/download-native.cgi 下载相应的包, 并将其中的tcnative-1.dll 拷贝到 tomcat的 bin 目录下, 这里千万注意 tcnative-1.dll 的版本, 区分好 32 / 64 位 -->
<Connector
port="9090"
protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="${catalina.base}/conf/ssl/localhost.crt"
SSLCertificateKeyFile="${catalina.base}/conf/ssl/localhost.key"
SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
/>
5. 验证
Chrome浏览器下, F12打开控制台,显示如下类似内容就代表成功:
6. Windows下的SSL证书管理
最后附加上SSL证书管理。
Win + R
之后,输入mmc
, 弹出的窗体下进行如下操作:
6. 参考
- Windows7(64位)环境下安装openssl
- openssl源码 - Github
- Mosquito使用SSL/TLS进行安全通信时的使用方法
- tomcat部署https,用openssl签发证书 — 在对SSL有所了解的情况下最推荐这个
- SSL证书生成全过程
- generate a self-signed certificate with SubjectAltName using OpenSSL
- Multiple Names on One Certificate
- 简单的OpenSSL配置文件讲解
- openssl req(生成证书请求和自建CA) – 细致地了解每个步骤,推荐以下两篇
- openssl ca(签署和自建CA)