写在前面
OPENSSL:
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
加密通信:
关于加密通信这里不做过多的讲解,消息通信时都需要加密,如果不加密,在请求和响应的过程中,如果消息中途被黑客劫持或篡改后果不堪设想;加密通信可以采用的方式有两种,一种是对称加密,一种是非对称或者叫公钥加密。对称加密的特点是发送方和接收方采用相同的 key ,非对称加密发送方和接收方采用的是不同的 key。
![0228.jpg 0228.jpg]()
![02281.jpg 02281.jpg]()
一、准备工作:
制作证书所需相关工具如下:
操作系统: | OPENSSL: | JAVA |
Windows7 64位 | OpenSSL 1.1.1i 8 Dec 2020 | JAVA SE Development Kit7 |
注:JAVA会默认安装在C:Program Files (x86)Javajdk1.7.0_13中,但是后面在pkcs12 格式文件转换时,在cmd窗口输入C:Program Files (x86)时会报错'C:Program' 不是内部或外部命令,也不是可运行的程序,原因为Program Files中间有空格,导致了该路径被作为一条命令被执行了,解决办法:安装完成后将整个Java目录拷贝至C:Java便于后期调用。
(1)需要配置Windows操作系统的系统环境变量
修改与添加环境变量方法:
![11111111.png 11111111.png]()
具体配置值如下:
新建系统变量JAVA_HOME 和CLASSPATH
JAVA_HOME | C:Javajdk1.7.0_13 |
CLASSPATH | C:ProgramFiles(x86)Javajdk1.7.0_13libtools.jar;C:ProgramFiles (x86)Javajdk1.7.0_13libdt.jar |
注:其中变量值为你自己安装jdk的文件目录
选择“系统变量”中变量名为“Path”的环境变量,双击该变量,把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。
Path | %JAVA_HOME%bin;%JAVA_HOME%jrebin; |
二、配置 openssl.cfg 文件
用记事本打开 C:Program Files (x86)OpenSSL-Win32bin路径下的 openssl.cfg 文件,然后在[ CA_default ]一节修改如下的配置项( 红色加粗字体表示手动配置的项,其他的均为默认值)。
| [ CA_default ] |
| dir = ./ca |
| certs = $dir/certs |
| crl_dir = $dir/crl |
| ***database = $dir/index.txt*** |
| |
| |
| ***new_certs_dir = $dir/newcerts*** |
| ***certificate = ca-cert.pem*** |
| serial = $dir/serial |
| crlnumber = $dir/crlnumber |
| |
| crl = $dir/crl.pem |
| ***private_key = ca-key.pem*** |
| ***RANDFILE = $dir/private/.rand*** |
注:我在操作时将上方星号的修改项在C:Program Files (x86)OpenSSL-Win32bincnfopenssl.cnf文件中也对应的做了更改。如果不改可能会造成openssl的bin目录下生成的ca-cert.pem为cacert.pem缺少“-”导致cmd无法调用。
三、制作证书
1.打开 cmd.exe,用“cd C:Program Files (x86)OpenSSL-Win32bin”命令,切换到 C:OpenSSLbin 目录下,执行如下命令:
| >set OPENSSL_CONF=C:\Program Files (x86)\OpenSSL-Win32\bin\openssl.cfg |
| >echo %OPENSSL_CONF% |
| >rd /s /q ca --删除ca文件夹 |
| >mkdir .\ca |
| >mkdir .\ca\newcerts |
| >mkdir .\ca\private |
| >copy nul ca\index.txt |
![2.png 2.png]()
| >set /p="01"<nul>>ca\serial |
| >mkdir server_ssl |
| >mkdir client_ssl |
![3.png 3.png]()
2.echo 生成 ca 私钥(ca-key.pem)和 ca 自签名证书(ca-cert.pem),需输入 ca 私钥存储密码
| >openssl req -new -x509 -days 3650 -keyout cakey.pem -out ca-cert.pem -subj "/C=cn/ST=hubei/L=wuhan/O=dameng/OU=developer/CN=fhx/emailAddress=fhx@demeng.com" |
注:最后一条命令执行过程会要求用户输入长度大于等于4字符的ca私钥存储密码,我们统一输入“123456”。记住:这个ca私钥的存储密码在给各个用户签名时还要用
![4.png 4.png]()
3.生成server端私钥和被ca签名的server数字证书,在上述命令行程序中继续执行下述语句:
| >set OPENSSL_CONF=C:\Program Files (x86)\OpenSSL-Win32\bin\openssl.cfg |
| >echo %OPENSSL_CONF% |
| rem 生成 server 私钥 server-key.pem,输入私钥密码 |
| >openssl genrsa -out server-key.pem 1024 |
| rem 生成 server 证书请求 server.csr |
| >openssl req -new -key server-key.pem -out server.csr -subj "/C=cn/ST=hubei/L=wuhan/O=dameng/OU=developer/CN=server/emailAddress=server@demeng.com" |
![5.png 5.png]()
rem 生成 server 经 ca 签名证书 server-cert.pem
| >openssl ca -startdate 20120531235959-0700 -enddate 20220531235959-0700 -in server.csr -out server-cert.pem |
![6.png 6.png]()
注:这里会报错,是由于rem 生成server经ca签名证书server-cert.pem
openssl ca -startdate 201110000000Z -enddate 301110000000Z -in server.csr -out server-cert.pem
这种方式生成的有GMT标识,时间参数为YYMMDDHHMMSSZ,其中的Z和java语言中时间格式的Z含义一致,表示UTC国际标准时间(也称GMT)如果需要证书带GMT格式且有效期需要人工指定,那么-startdate和--enddate 参数值需要严格按照YYMMDDHHMMSSZ格式要求书写,所以修改时间字符如下
| >openssl ca -startdate 20120531235959Z -enddate 20220531235959Z -in server.csr -out server-cert.pem |
![7.png 7.png]()
注:这里还是会报错,打开openssl的bin目录会发现生成的ca-key.pem文件名为cakey.pem缺少“-”手动修改文件名后再执行
![8.png 8.png]()
![9.png 9.png]()
4.server 可信证书转换为格式 X509
| >openssl x509 -in server-cert.pem -out server.cer |
| >copy ca-cert.pem server_ssl\ |
| >copy ca-key.pem server_ssl\ |
| >copy server.csr server_ssl\ |
| >copy server.cer server_ssl\ |
| >copy server-cert.pem server_ssl\ |
| >copy server-key.pem server_ssl\ |
![10.png 10.png]()
注:执行过程中,当要求输入 cakey.pem 的存储私钥时,请输入“123456”
5.生成用户私钥和被ca签名的用户数字证书
此处的用户名为 TEST,若是其他用户名只需全局替换用户名即可。
在上述命令行程序中继续执行下述语句:
| >set OPENSSL_CONF=C:\Program Files (x86)\OpenSSL-Win32\bin\openssl.cfg |
| >echo %OPENSSL_CONF% |
| >rd /s /q TEST --删除TEST的文件夹 |
| >mkdir .\TEST |
rem 生成 TEST 私钥 client-key.pem,输入私钥密码
| >openssl genrsa -out TEST/client-key.pem 1024 |
rem 生成 TEST 证书请求 client.csr
| >openssl req -new -key TEST/client-key.pem -out TEST/client.csr -subj "/C=cn/ST=hubei/L=wuhan/O=dameng/OU=developer/CN=TEST/emailAddress=TEST@dameng.com" |
![11.png 11.png]()
注:这时,又会报错文件名不对,手动修改文件名后再次执行
![12.png 12.png]()
rem 生成 TEST 经 ca 签名证书 client-cert.pem(ca-key.pem:一定要输123456)
| >openssl ca -startdate 20120531235959Z -enddate 20220531235959Z -in TEST/client.csr -out TEST/client-cert.pem |
![13.png 13.png]()
rem 将 X.509 格式的 client-key.pem 和 client-cert.pem 合并转换为 pkcs12 格式的文件 client-pkcs.p12 rem 务必输入 export password 为 changeit(小写)
| >openssl pkcs12 -export -inkey TEST/client-key.pem -in TEST/client-cert.pem -out TEST/client-pkcs.p12 |
![14.png 14.png]()
| C:\Java\jdk1.7.0_13\bin\keytool -import -alias ca1 -trustcacerts -file ca-cert.pem -keystore TEST/.keystore -deststorepass changeit -noprompt |
![15.png 15.png]()
| C:\Java\jdk1.7.0_13\bin\keytool -import -alias server -trustcacerts -file server.cer -keystore TEST/.keystore -deststorepass changeit -noprompt |
![16.png 16.png]()
| C:\Java\jdk1.7.0_13\bin\keytool -v -importkeystore -srckeystore TEST/client-pkcs.p12 -srcstoretype PKCS12 -keystore TEST/.keystore -deststorepass changeit |
![17.png 17.png]()
| >copy ca-cert.pem TEST\ |
| >move TEST client_ssl\ |
![18.png 18.png]()
注:执行过程中,当要求输入 ca-key.pem 的存储私钥时,请输入“123456”,当要求输入 pkcs.p12 的 export password 时,请务必输入小写的“changeit”。
![19.png 19.png]()
![20.png 20.png]()
6.证书的使用
修改dm.ini文件中的enable_enecrypt=1打开OPENSSL登录
将操作系统Openssl文件夹中生成的client_ssl文件夹中对应的用户目录拷贝到/home/dmdba/dmdbms/bin/client_ssl/TEST
将操作系统Openssl文件夹中生成的server_ssl文件夹中的文件拷贝到/home/dmdba/dmdbms/bin/server_ssl目录中
测试效果如下:
![21.png 21.png]()
![21.png 21.png]()
![22.png 22.png]()
数据库通信加密测试
Windows直接使用Wireshark软件,Linux环境使用tcpdump进行抓包,然后使用Wireshark打开抓包数据进行查看验证或者直接查看文件简单搜索进行比较。
未加密:
![jmcs.png jmcs.png]()
![jmcs1.png jmcs1.png]()
加密:
![jmcs2.png jmcs2.png]()
以上证书制作就完成了,感兴趣的胖友可以自己动手尝试一下呢,以下为相关工具的下载地址,可以自行提取:
Openssl:
链接:https://pan.baidu.com/s/1IuGOafrgkZCoXla1pbMIpA
提取码:40ir
(2)JAVA
JAVA1.7:
链接:https://pan.baidu.com/s/12Bv8phPiG7MMuszLccuFUA
提取码:bhf7
评论已关闭