灵活多变的keytool和openssl生成证书,应用tomcat和nginx

灵活多变的keytool和openssl生成证书,应用tomcat和nginx

前言

一般来说,主流的Web服务软件,通常都基于两种基础密码库:OpenSSL和Java。

  • Tomcat、Weblogic、JBoss等,使用Java提供的密码库。通过Java的Keytool工具,生成Java
    Keystore(JKS)格式的证书文件。Tomcat支持JKS格式证书,从Tomcat7开始也支持PFX格式证书,两种证书格式任选其一。

  • Apache、Nginx等,使用OpenSSL提供的密码库,生成PEM、KEY、CRT等格式的证书文件。

  • IBM的Web服务产品,如Websphere、IBM Http
    Server(IHS)等,一般使用IBM产品自带的iKeyman工具,生成KDB格式的证书文件。

  • 微软Windows Server中的Internet Information
    Services(IIS)服务,使用Windows自带的证书库生成PFX格式的证书文件。

什么是证书?为什么要使用证书?

对数据进行签名(加密)是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。

签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。
比如微信公众平台开发中最常见的调用api接口方法是将参数进行字典序排序,然后将参数名和参数值接成一个字符串,组合的字符串也就相当于我们这里说的摘要,然后将摘要用平台密钥加密。

接收者(客户端)接受到数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。

那么怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是
X.509

证书格式转换

Windows安装使用Openssl

证书格式的转换如下图:

在这里插入图片描述

Note: 阿里云云盾证书服务统一使用 PEM 格式的数字证书文件。

  1. 将JKS格式证书转换成PFX格式(jks->pfx)

您可以使用JDK中自带的Keytool工具,将JKS格式证书文件转换成PFX格式。

例如,您可以执行以下命令将server.jks证书文件转换成server.pfx证书文件:

keytool -importkeystore -srckeystore D:\\server.jks -destkeystore D:\\server.pfx
-srcstoretype JKS -deststoretype PKCS12
  1. 将PFX格式证书转换为JKS格式

您可以使用JDK中自带的Keytool工具,将PFX格式证书文件转换成JKS格式。

例如,您可以执行以下命令将server.pfx证书文件转换成server.jks证书文件:

keytool -importkeystore -srckeystore D:\\server.pfx -destkeystore D:\\server.jks
-srcstoretype PKCS12 -deststoretype JKS
  1. 将PEM/KEY/CRT格式证书转换为PFX格式

您可以使用
OpenSSL工具,将KEY格式密钥文件和CRT格式公钥文件转换成PFX格式证书文件。

例如,将您的KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt)拷贝至OpenSSL工具安装目录,使用OpenSSL工具执行以下命令将证书转换成server.pfx证书文件:

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
  1. 将PFX转换为PEM/KEY/CRT

可以使用 OpenSSL工具,将PFX格式证书文件转化为KEY格式密钥文件和CRT格式公钥文件。

例如,将您的PFX格式证书文件拷贝至OpenSSL安装目录,使用OpenSSL工具执行以下命令将证书转换成server.pem证书文件,KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt):

openssl pkcs12 -in server.pfx -nodes -out server.pem openssl rsa -in server.pem -out server.key

//此转换步骤是专用于通过Keytool工具生成私钥和CSR申请证书文件的,并且通过此方法您可以在获取到PEM格式证书公钥的情况下分离私钥。

openssl x509 -in server.pem -out server.crt

证书格式

您可以使用以下方法简单区分带有后缀扩展名的证书文件:

  1. *.DER或*.CER文件:
    这样的证书文件是二进制格式,只含有证书信息,不包含私钥。

  2. *.CRT文件:
    这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与
    *.DER及*.CER证书文件相同。

  3. *.PEM文件:
    这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 *.PEM
    文件如果只包含私钥,一般用*.KEY文件代替。

  4. *.PFX或*.P12文件:
    这样的证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护。

您也可以使用记事本直接打开证书文件。如果显示的是规则的数字字母,例如:

—–BEGIN CERTIFICATE—– MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......
—–END CERTIFICATE—–

那么,该证书文件是文本格式的。

如果存在——BEGIN CERTIFICATE——,则说明这是一个证书文件。

如果存在—–BEGIN RSA PRIVATE KEY—–,则说明这是一个私钥文件。

(Java、.Net、Php)语言需要的证书格式并不一致,比如说Java我们采用jks,.Net采用pfx和cer,Php则采用pem和cer;

主要分成两类,其一为密钥库文件格式、其二为证书文件格式;

密钥库文件格式【Keystore】

格式扩展名描述特点
JKS.jks/.ks【Java Keystore】密钥库的Java实现版本,provider为SUN密钥库和私钥用不同的密码进行保护
JCEKS.jceJCE Keystore】密钥库的JCE实现版本,provider为SUN JCE相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES
PKCS12.p12/.pfx【PKCS #12】个人信息交换语法标准密钥库和私钥用不同的密码进行保护
JKS.jks/.ks【Java Keystore】密钥库的Java实现版本,provider为SUN1、包含私钥、公钥及其证书\2、密钥库和私钥用相同密码进行保护

证书文件格式【Certificate】

格式扩展名描述特点
DER.cer/.crt/.rsa【ASN .1 DER】用于存放证书不含私钥、二进制
PKCS7.p7b/.p7r【PKCS #7】加密信息语法标准1、p7b以树状展示证书链,不含私钥
2、p7r为CA对证书请求签名的回复,只能用于导入
CMS.p7c/.p7m/.p7s【Cryptographic Message Syntax】1、p7c只保存证书2、p7m:signature with enveloped data3、p7s:时间戳签名文件
PEM.pem【Printable Encoded Message】1、该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理2、ASCII文件3、一般基于base 64编码
PKCS10.p10/.csr 【PKCS #10】公钥加密标准【Certificate Signing Request】1、证书签名请求文件2、ASCII文件3、CA签名后以p7r文件回复
SPC.pvk/.spc【Software Publishing Certificate】微软公司特有的双证书文件格式,经常用于代码签名,其中1、pvk用于保存私钥2、spc用于保存公钥

jks是JAVA的keytools证书工具支持的证书私钥格式。

pfx是微软支持的私钥格式。

cer是证书的公钥。

如果是你私人要备份证书的话记得一定要备份成jks或者pfx格式,否则恢复不了。

简单来说,cer就是你们家邮箱的地址,你可以把这个地址给很多人让他们往里面发信。

pfx或jks就是你家邮箱的钥匙,别人有了这个就可以冒充你去你家邮箱看信,你丢了这个也没法开邮箱了。

keytool是什么?

Keytool 是一个Java 数据证书的管理工具 ,Keytool
将密钥(key)和证书(certificates)存在一个称为keystore的文件中
在keystore里,包含两种数据:

密钥实体(Key entity)——密钥(secret
key)又或者是私钥和配对公钥(采用非对称加密)

可信任的证书实体(trusted certificate entries)——只包含公钥

而我们常说的证书就是就是上面说的公钥,公钥是公开给其它人使用的。也就是常用说的搬发证书。

keytool的帮助命令

keytool -help

结果如下

PS D:\keys> keytool -help
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

查看某个命令帮助

keytool -genkeypair

keytool官方文档

主要格式

keytool 采用 keystore 文件来存储密钥及证书,其中可包括私钥、信任证书;

keystore 文件主要使用
JKS格式(也可支持其他格式),带密钥存储;其中私钥的存储也有独立的密码;

通过keytool -genkeypair -storetype 格式指定

其它还包括jceks,jks,dks,pkcs11,pkcs12。

test.keystore和test.jks区别

keytool -genkeypair -alias serverkey -keystore server.keystore -storetype jks

与下面和是等价的,都是jks格式密钥文件。

keytool -genkeypair -alias serverkey -keystore server.jks

keytool生成tomcat证书

Tomcat支持JKS格式证书,从Tomcat7开始也支持PFX格式证书,两种证书格式任选其一。

生成私钥和证书

keytool -genkeypair -alias dongli -keystore dongli.jks -keypass 123456
-storepass 123456 -keyalg RSA -keysize 2048 -validity 365
storepass:keystore 文件存储密码

keypass: 私钥加解密密码

alias:实体别名(包括证书私钥)

keyalt:采用公钥算法,默认是DSA,还有RSA算法可选

keysize:密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)

validity:有效期(至少设一年,你也不想经常要升级证书吧)

keystore:指定keystore文件

提示输入的姓名和姓氏输入域名,比较http://192.168.1.243(假设你在局域网使用https协议)

扩展

如果想创建pkcs12格式密钥文件

keytool -genkeypair -alias dongli -keystore dongli.jks -keypass 123456
-storetype pkcs12 -storepass 123456 -keyalg RSA -keysize 2048 -validity 365

查看证书详情

keytool -list -keystore dongli.jks -storepass 123456

结果如下

PS D:\keys> keytool -list -keystore dongli.jks  -storepass 123456
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

dongli, 2018-10-24, PrivateKeyEntry,
证书指纹 (SHA1): 20:84:B4:01:A0:2B:54:48:8D:F5:10:27:7F:93:D5:11:F9:A8:1C:79

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore dongli.jks -destkeystore dongli.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

加上-v选项可查看更详细信息

keytool -list -v -keystore dongli.jks -storepass 123456

jks转成pkcs12格式证书

其实上面命令行已经提示了

keytool -importkeystore -srckeystore dongli.jks -destkeystore dongli.jks -deststoretype pkcs12

导出证书

导出证书就是将导出公钥文件

keytool -exportcert -keystore dongli.jks -file dongli.cer -alias dongli -storepass 123456

注意:-alias
dongli,为什么要别名?因为dongli.jks里可以存储多对公私钥文件,它们之间是通过别名区分的,所以这里是通过别名指定导出的是密钥文件里别名是dongli的公钥证书。

此时导出的证书为DER编码格式,-rfc选项,可输出pem编码格式的证书

导入证书

导入证书其实是在客户机器上使用的。如果是CA申请的证书是自动完成的。其实如果是官方认证过的证书,这步可以省略。

  • 双击dongli.cer完成导入操作

  • keytool -importcert -keystore client_trust.keystore -file dongli.cer -alias
    client_trust_server -storepass 123456。结果如下

PS D:\keys> keytool -importcert -keystore client_trust.keystore  -file dongli.cer -alias client_trust_server -storepass
123456
所有者: CN=http://192.168.1.243, OU=http://192.168.1.243, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
发布者: CN=http://192.168.1.243, OU=http://192.168.1.243, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
序列号: 466adb68
有效期为 Wed Oct 24 11:15:01 CST 2018 至 Thu Oct 24 11:15:01 CST 2019
证书指纹:
         MD5:  A0:2D:00:2F:97:3D:84:64:E2:F7:C0:17:50:F1:24:8D
         SHA1: 20:84:B4:01:A0:2B:54:48:8D:F5:10:27:7F:93:D5:11:F9:A8:1C:79
         SHA256: FA:DF:E3:11:AF:1B:BA:3B:59:1D:39:44:EB:62:FA:EA:76:56:A2:6B:D9:26:33:68:D2:D8:49:E0:0D:15:BD:C4
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: D7 07 91 5D 1F 1A C8 DB   EB 9E 10 76 63 4B 5A DE  ...].......vcKZ.
0010: 2B 01 89 2E                                        +...
]
]

是否信任此证书? []:  y
证书已添加到密钥库中

证书安装

PFX证书安装

找到安装Tomcat目录下该文件server.xml,一般默认路径都是在 conf 文件夹中。找到
<Connection port="8443"标签,增加如下属性:

keystoreFile="cert/214936953020033.pfx"
keystoreType="PKCS12"
#此处的证书密码,请参考附件中的密码文件或在第1步中设置的密码
keystorePass="证书密码"

完整的配置如下,其中port属性根据实际情况修改:

<Connector port="8443"
    protocol="HTTP/1.1"
    SSLEnabled="true"
    scheme="https"
    secure="true"
    keystoreFile="cert/214936953020033.pfx"
    keystoreType="PKCS12"
    keystorePass="证书密码"
    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"/>

JKS证书安装

  • 如果只能pfx格式的文件,使用java
    jdk将PFX格式证书转换为JKS格式证书(windows环境注意在%JAVA_HOME%/jdk/bin目录下执行)
keytool -importkeystore -srckeystore 214936953020033.pfx -destkeystore
your-name.jks -srcstoretype PKCS12 -deststoretype JKS
  • 找到安装 Tomcat 目录下该文件Server.xml,一般默认路径都是在 conf
    文件夹中。找到 <Connection port="8443"标签,增加如下属性:
keystoreFile="cert/your-name.jks"
keystorePass="证书密码"

完整的配置如下,其中port属性根据实际情况修改:

<Connector port="8443"
    protocol="HTTP/1.1"
    SSLEnabled="true"
    scheme="https"
    secure="true"
    keystoreFile="cert/your-name.jks"
    keystorePass="证书密码"
    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"/>

注意:不要直接拷贝所有配置,只需添加
keystoreFile,keystorePass等参数即可,其它参数请根据自己的实际情况修改

nginx证书

nginx证书安装只要key和pem文件

  • 在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为test.key

  • 打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到:

# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

修改为
(以下属性中ssl开头的属性与证书配置有直接关系,其它属性请结合自己的实际情况复制或调整)
:

server {
    listen 443;
    server_name localhost;
    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   cert/214936953020033.pem;
    ssl_certificate_key  cert/214936953020033.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        root html;
        index index.html index.htm;
    }
}

保存退出,重启 Nginx。

脚本

set pwd=123456
set name=dongli
set dd=%cd%

:: 生成jks
rmdir /s /q jks
mkdir jks
cd jks
keytool -genkeypair -alias %name% -keystore %name%.jks -storetype pkcs12 -keypass %pwd% -storepass %pwd%  -keyalg RSA -keysize 2048 -validity 365 -dname "CN=http://192.168.1.243,OU=xx,O=dy, L=nb,ST=zj,C=china"

keytool -exportcert -keystore %name%.jks -file %name%.cer -alias %name% -storepass %pwd%
cd %dd%

:: 转换jks->pfx
rmdir /s /q pfx
mkdir pfx
keytool -importkeystore -srckeystore %dd%/jks/%name%.jks -destkeystore %dd%/pfx/%name%.pfx -srcstoretype PKCS12 -deststoretype PKCS12 -srcstorepass %pwd% -deststorepass %pwd%



:: 转换pfx->pem/key
rmdir /s /q pem
mkdir pem
openssl pkcs12 -in %dd%/pfx/%name%.pfx -nodes -out %dd%/pem/%name%.pem -password pass:%pwd%
openssl rsa -in %dd%/pem/%name%.pem -out %dd%/pem/%name%.key
cd %dd%
keytool -list -v -keystore %dd%/jks/%name%.jks -storepass %pwd%
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值