admin管理员组文章数量:1662882
灵活多变的keytool和openssl生成证书,应用tomcat和nginx
文章目录
- 前言
- 什么是证书?为什么要使用证书?
- 证书格式转换
- 证书格式
- keytool是什么?
- 主要格式
- test.keystore和test.jks区别
- keytool生成tomcat证书
- 生成私钥和证书
- 查看证书详情
- jks转成pkcs12格式证书
- 导出证书
- 导入证书
- 证书安装
- PFX证书安装
- JKS证书安装
- 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 格式的数字证书文件。
- 将
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
- 将
PFX
格式证书转换为JKS
格式
您可以使用JDK中自带的Keytool
工具,将PFX
格式证书文件转换成JKS
格式。
例如,您可以执行以下命令将server.pfx
证书文件转换成server.jks
证书文件:
keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks -srcstoretype PKCS12 -deststoretype JKS
- 将
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
- 将
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
证书格式
您可以使用以下方法简单区分带有后缀扩展名的证书文件:
*.DER
或*.CER
文件: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。*.CRT
文件: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与*.DER
及*.CER
证书文件相同。*.PEM
文件: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。*.PEM
文件如果只包含私钥,一般用*.KEY文件代替。*.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 | .jce | JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE | 相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES |
PKCS12 | .p12/.pfx | 【PKCS #12】个人信息交换语法标准 | 密钥库和私钥用不同的密码进行保护 |
JKS | .jks/.ks | 【Java Keystore】密钥库的Java实现版本,provider为SUN | 1、包含私钥、公钥及其证书\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%
版权声明:本文标题:灵活多变的keytool和openssl生成证书,应用tomcat和nginx 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729970285a1218056.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论