Windows下编译OpenSSL

在Windows下编译OpenSSL,并使用编译出来的OpenSSL应用生成CA证书和服务端签名,并在Tomcat中应用。

1. 概述

本人之前专门创建了一台虚拟机用来编译Nginx(Nginx技巧之Windows下编译),因此编译OpenSSL所需要的VS,Perl等都已经安装到位了,因此笔者决定走自编译的路线。对于直接安装感兴趣的可以参见 - openssl安装包 - 方便安装

所以我们先把本次将要完成的操作总结一下:

  1. 编译OpenSSL
  2. 使用编译出来的OpenSSL 自签发 CA 根证书
  3. 使用自签发的CA根证书为相应的服务端签发证书
  4. 客户端直接导入签发服务器证书的CA自签证书,本次不进行双向认证。

2. 编译OpenSSL

  1. 将openssl源码解压,推荐放到一个根目录下。例如:c:\openssl-1.0.1u

  2. 打开VS命令行工具,这里千万要注意版本号,一定要跟你想要编译的OpenSSL版本号一致;例如下图表明我们需要编译的是64位版本的OpenSSL。
    VS命令行工具

  3. 在上面打开的控制台中执行如下命令:

    # 切换到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签发证书。

  1. 首先准备好配置文件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
    
  2. 生成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证书和密钥

以上,将在当前目录下生成CA根证书和密钥,即root.crtroot.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.crtlocalhost.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签发证书
  1. 如无需实现双向认证,则无需准备客户端的东东。
  2. 客户端只需要导入签发服务器证书的CA自签证书即可。
  3. 按照本次的需求, 这一步先省略。

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打开控制台,显示如下类似内容就代表成功:
Chrom控制台

6. Windows下的SSL证书管理

最后附加上SSL证书管理。

Win + R 之后,输入mmc, 弹出的窗体下进行如下操作:SSL证书管理

6. 参考

  1. Windows7(64位)环境下安装openssl
  2. openssl源码 - Github
  3. Mosquito使用SSL/TLS进行安全通信时的使用方法
  4. tomcat部署https,用openssl签发证书 — 在对SSL有所了解的情况下最推荐这个
  5. SSL证书生成全过程
  6. generate a self-signed certificate with SubjectAltName using OpenSSL
  7. Multiple Names on One Certificate
  8. 简单的OpenSSL配置文件讲解
  9. openssl req(生成证书请求和自建CA) – 细致地了解每个步骤,推荐以下两篇
  10. openssl ca(签署和自建CA)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值