使用keytool和openssl生成证书及格式互转 |
您所在的位置:网站首页 › 证书转换pem › 使用keytool和openssl生成证书及格式互转 |
Java 证书证书管理(keytool实例)--jks\crt\cet\ketstore
https://www.cnblogs.com/molao-doing/articles/9687445.html 一、什么是证书、为什么要引用证书对数据进行签名(加密)是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。 签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。 比如微信公众平台开发中最常见的调用api接口方法是将参数进行字典序排序,然后将参数名和参数值接成一个字符串,组合的字符串也就相当于我们这里说的摘要,然后将摘要用平台密钥加密。接收者(客户端)接受到数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。那么怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509。 二、证书生成与管理(基于keytool) Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)-只包含公钥 JDK中keytool常用参数说明(不同版本有差异,详细可参见【附录】中的官方文档链接): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 -genkey 在用户主目录 -genkey 在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录) -alias 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中) -keyalg 指定密钥的算法 (如 RSA DSA,默认值为:DSA) -validity 指定创建的证书有效期多少天(默认 90) -keysize 指定密钥长度 (默认 1024) -storepass 指定密钥库的密码(获取keystore信息所需的密码) -keypass 指定别名条目的密码(私钥的密码) -dname 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码” -list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码 -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码 -file 参数指定导出到文件的文件名 -delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码 -printcert 查看导出的证书信息 keytool -printcert -file g:\sso\michael.crt -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage -storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码) -import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书 中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录) -alias 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中) -keyalg 指定密钥的算法 (如 RSA DSA,默认值为:DSA) -validity 指定创建的证书有效期多少天(默认 90) -keysize 指定密钥长度 (默认 1024) -storepass 指定密钥库的密码(获取keystore信息所需的密码) -keypass 指定别名条目的密码(私钥的密码) -dname 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码” -list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码 -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码 -file 参数指定导出到文件的文件名 -delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码 -printcert 查看导出的证书信息 keytool -printcert -file g:\sso\michael.crt -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage -storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码) -import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书 三、使用keytool工具创建证书 a、创建证书yunbo.keystore文件 1 keytool -genkey -alias "yunBo" -keyalg "RSA" -keystore "d:\jkstest\yunbo.keystore" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass "123456" -storepass "changeit" -validity 180
b、对应命令解释 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -genkey 表示要创建一个新的密钥 -dname 表示密钥的Distinguished Names, 表明了密钥的发行者身份 CN=commonName 注:生成证书时,CN要和服务器的域名相同,如果在本地测试,则使用localhost OU=organizationUnit O=organizationName L=localityName S=stateName C=country -keyalg 使用加密的算法,这里是RSA -alias 和keystore关联的别名,这个alias通常不区分大小写 -keypass 私有密钥的密码,这里设置为 123456 -keystore 密钥保存在D:盘目录下的yunbo.keystore文件中 -storepass 存取密码,这里设置为changeit,这个密码提供系统从yunbo.keystore文件中将信息取出 -validity 该密钥的有效期为 180天 (默认为90天)
d、默认缺省值 1 2 3 4 5 6 -alias "mykey" -keyalg "DSA" -keysize 1024 -validity 90 -keystore 用户宿主目录中名为 .keystore 的文件 -file 读时为标准输入,写时为标准输出
cacerts证书文件(The cacerts Certificates File) 该证书文件存在于java.home\jre\lib\security目录下,是Java系统的CA证书仓库 导出证书给客户端安装 上面我们已经在D盘生成了一个yunbo.keystore文件,现在我们导出一个yunbo.cer格式的证书 1 keytool -export -alias yunBo -keystore d:\jkstest\yunbo.keystore -file d:\jkstest\yunbo.cer -storepass "changeit" 客户端配置:为客户端的JVM导入密钥(将服务器下发的证书导入到JVM中)
生成的证书可以交付客户端用户使用,用以进行SSL通讯,或者伴随电子签名的jar包进行发布者的身份认证。常出现的异常:“未找到可信任的证书”--主要原因为在客户端未将服务器下发的证书导入到JVM中,可以用 1 keytool -import -trustcacerts -alias yunBo -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -file d:/jkstest/yunbo.cer -storepass "changeit" 生成的证书可以交付客户端用户使用,用以进行SSL通讯,或者伴随电子签名的jar包进行发布者的身份认证。 常出现的异常:“未找到可信任的证书”--主要原因为在客户端未将服务器下发的证书导入到JVM中, 可以用 keytool -list -alias yunbo -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit 来查看证书是否真的导入到JVM中。
1 2 yunbo, 2018-9-23, trustedCertEntry, 证书指纹 (SHA1): BF:7E:C3:07:03:EA:41:50:02:B9:C7:15:38:54:BF:80:01:D1:1D:D5
示例说明: 浏览证书库里面的证书信息,可以使用如下命令 keytool -list -v -alias tomcat -keystore cacerts -storepass 666666 keytool -list -rfc -keystore e:/yushan.keystore -storepass 123456 keytool -list -v -keystore privateKey.store
缺省情况下,-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项,将以可读格式打印证书,如果指定了 -rfc 选项,将以可打印的编码格式输出证书
要删除证书库里面的某个证书,可以使用如下命令: keytool -delete -alias tomcat -keystore cacerts -storepass 666666 要导出证书库里面的某个证书,可以使用如下命令 keytool -export -keystore cacerts -storepass 666666 -alias yunbo -file d:/jkstest/yunbo.cer keytool -export -alias yunbo -keystore e:/server.jks -file d:/jkstest/yunbo.crt -rfc -storepass changeit *备注: keystore.jks 也可以为 .keystore格式 ; server.crt也可以为 .cer格式 "-rfc" 表示以base64输出文件,否则以二进制输出 要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效) 这个是交互式的,在输入命令后,会要求你输入密码 keytool -keypasswd -alias yunbo -keystore cacerts 这个不是交互式的,输入命令后直接更改 Keytool -keypasswd -alias yunbo -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts 修改别名: keytool -changealias -keystore mykeystore.keystore -alias 当前别名 -destalias 新别名 主流数字证书都有哪些格式 一般来说,主流的Web服务软件,通常都基于OpenSSL和Java两种基础密码库。 Tomcat、Weblogic、JBoss等Web服务软件,一般使用Java提供的密码库。通过Keytool工具,生成Java Keystore(JKS)格式的证书文件。Apache、Nginx等Web服务软件,一般使用OpenSSL工具提供的密码库,生成PEM、KEY、CRT等格式的证书文件。IBM的Web服务产品,如Websphere、IBM Http Server(IHS)等,一般使用IBM产品自带的iKeyman工具,生成KDB格式的证书文件。微软Windows Server中的Internet Information Services(IIS)服务,使用Windows自带的证书库生成PFX格式的证书文件。判断证书文件是文本格式还是二进制格式 您可以使用以下方法简单区分带有后缀扩展名的证书文件: *.DER或*.CER文件: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。*.CRT文件: 这样的证书文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与 *.DER及*.CER证书文件相同。*.PEM文件: 这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 *.PEM 文件如果只包含私钥,一般用*.KEY文件代替。*.PFX或*.P12文件: 这样的证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护。
您也可以使用记事本直接打开证书文件。如果显示的是规则的数字字母,例如: —–BEGIN CERTIFICATE—– MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh...... —–END CERTIFICATE—–那么,该证书文件是文本格式的。 如果存在——BEGIN CERTIFICATE——,则说明这是一个证书文件。如果存在—–BEGIN RSA PRIVATE KEY—–,则说明这是一个私钥文件证书格式之间的转换如下图: Note: 阿里云云盾证书服务统一使用 PEM 格式的数字证书文件。 将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.pemopenssl rsa -in server.pem -out server.keyopenssl x509 -in server.pem -out server.crt Note: 此转换步骤是专用于通过Keytool工具生成私钥和CSR申请证书文件的,并且通过此方法您可以在获取到PEM格式证书公钥的情况下分离私钥。
(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】个人信息交换语法标准 1、包含私钥、公钥及其证书 2、密钥库和私钥用相同密码进行保护 BKS .bks 【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC 基于JCE实现 UBER .ubr 【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC
证书文件格式【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 data 3、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用于保存公钥
1、Java平台keytool对X.509证书的支持并不一致,6.0版本之前生成的证书都是v1版本的,这在很多应用场合可能会导致一些潜在的问题,但是他还是能够管理v3版本的证书的,从6.0开始keytool支持v3版本的证书生成; 2、Eclipse插件SecureX推荐,这是一个国人贡献的证书生成、管理工具,效果还是不错的,而且可以下载源代码查看,对学习Security方面的编程很有帮助,可以从http://securex.sourceforge.net/updatesite更新,目前版本为2.0,不过好像现在作者也没有更新了; 3、KeyTool IUI工具推荐,这是一个老外编写的Keytool GUI工具,功能大致和SecureX类似,他可以以application或者Java Web Start启动查看,但作者并没有提供源代码下载,首页为http://yellowcat1.free.fr/keytool_iui.html; 4、https://www.chinassl.net/ssltools/keytool-commands.html 常用的Java Keytool Keystore命令 ---------------------------------------------------------------------- keytool生成证书示例https://www.cnblogs.com/cuimiemie/p/6442668.html 生成私钥+证书:keytool -genkey -alias client -keysize 2048 -validity 3650 -keyalg RSA -dname "CN=localhost" -keypass $client_passwd -storepass $client_passwd -keystore ClientCert.jks 生成文件文件ClientCert.jks。 导出证书: ~/tmp/cert# keytool -export -alias client -keystore ClientCert.jks -storepass $client_passwd -file ClientCert.crt Certificate stored in file ~/tmp/cert# ll total 8 -rw-r--r-- 1 root root 715 Jun 14 20:24 ClientCert.crt -rw-r--r-- 1 root root 2066 Jun 14 20:21 ClientCert.jkskeytool工具不支持导出私钥。 openssl生成证书示例生成公钥私钥: ~/tmp/cert# openssl genrsa -des3 -out private.pem 1024 Generating RSA private key, 1024 bit long modulus .............................++++++ ...........++++++ e is 65537 (0x10001) Enter pass phrase for private.pem: Verifying - Enter pass phrase for private.pem: ~/tmp/cert# ll total 4 -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem创建证书请求: ~/tmp/cert# openssl req -subj "/C=CN/ST=BJ/L=BJ/O=HW/OU=HW/CN=CL/[email protected]" -new -out cert.csr -key private.pem Enter pass phrase for private.pem: ~/tmp/cert# ll total 8 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem自签发证书: ~/tmp/cert# openssl x509 -req -in cert.csr -out public.crt -outform pem -signkey private.pem -days 3650 Signature ok subject=/C=CN/ST=BJ/L=BJ/O=HW/OU=HW/CN=CL/[email protected] Getting Private key Enter pass phrase for private.pem: ~/tmp/cert# ll total 12 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt 转换keytool和openssl生成的证书相互之间无法识别,keytool生成的为jsk文件,openssl默认生成的为PEM格式文件。需要先转换成pkcs12格式,然后再使用对方的命令转换成需要的格式。 keytool生成的证书转换为PEM格式 ~/tmp/cert# keytool -importkeystore -srcstoretype JKS -srckeystore ServerCert.jks -srcstorepass 123456 -srcalias server -srckeypass 123456 -deststoretype PKCS12 -destkeystore client.p12 -deststorepass 123456 -destalias client -destkeypass 123456 -noprompt root@SZV1000101361:~/tmp/cert# ll total 24 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 1708 Jun 14 21:01 client.p12 -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12导出证书: ~/tmp/cert# openssl pkcs12 -in client.p12 -passin pass:$passwd -nokeys -out client.pem MAC verified OK导出私钥: ~/tmp/cert# openssl pkcs12 -in client.p12 -passin pass:$passwd -nocerts -out client.crt MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: root@SZV1000101361:~/tmp/cert# ll total 32 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 1184 Jun 14 21:10 client.crt -rw-r--r-- 1 root root 1708 Jun 14 21:01 client.p12 -rw-r--r-- 1 root root 1127 Jun 14 21:07 client.pem -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12 PEM格式证书转换为jks文件转换为pkcs12格式: ~/tmp/cert# openssl pkcs12 -export -in public.crt -inkey private.pem -out server.p12 -name server -passin pass:${passwd} -passout pass:${passwd} ~/tmp/cert# ll total 16 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12导入到jks中: ~/tmp/cert# keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass ${passwd} -alias server -deststorepass ${passwd} -destkeypass ${passwd} -destkeystore ServerCert.jks ~/tmp/cert# ll total 20 -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |