asn1 pem pfx格式证书_如何进行证书、私钥相关的各种操作

本文详细介绍了如何生成和管理asn1, pem, pfx格式的证书,涵盖从公私钥对生成,证书转换,pfx打包,到jks导入,以及SSL双向连接模拟等操作。" 106383671,9397224,Java基础知识详解:方法、选择结构与循环语句,"['Java', '编程语言', '基础教程', '控制流程', '方法定义']

需求1:生成公私钥对和证书(pem格式或der格式)

生成公私钥对和证书请求 openssl req -newkey rsa:1024 -sha1 -pubkey -config myopenssl.cnf -keyout root.pri.key.pem -out root.cer.req.pem -days 3650 > root.pub.key.pem

根据公私钥对和证书请求生成pem格式的证书 openssl x509 -req -in root.cer.req.pem -sha1 -extfile myopenssl.cnf -extensions v3_ca -signkey root.pri.key.pem -out root.cer.pem -days 3650

以上得到的产物包括: 私钥文件:root.pri.key.pem

公钥文件:root.pub.key.pem

pem格式证书:root.cer.pem

需求2:生成pfx(基于需求1)

将私钥和公钥合并 cat root.cer.pem root.pri.key.pem > root.pem

生成pfx openssl pkcs12 -in root.pem -export -out root.pfx

需求3:从第三方vendor获得的证书导出公钥

从vendor获得vendor.cer.pem

从pem格式的证书中导出pem格式的公钥 openssl x509 -inform PEM -in vendor.cer.pem -outform PEM -pubkey -noout > vendor.pub.key.pem

需求4:用第三方vendor的证书生成jks

从vendor获得vendor.cer.pem

从pem证书生成jks keytool -import -alias paygate_cert -keystore vendor.jks -storepass 111111 -trustcacerts -file vendor.cer.pem

然后, keytool -import -alias cfca_rca -keystore vendor.jks -storepass 111111 -trustcacerts -file rca.pemkeytool -import -alias cfca_pca -keystore vendor.jks -storepass 111111 -trustcacerts -file pca.pemkeytool -import -alias cfca_oca -keystore vendor.jks -storepass 111111 -trustcacerts -file oca.pem

需求5:查看jks状态 keytool -list -keystore vendor.jks -storepass 111111

需求6:查看证书编号、有效期等详细信息 keytool -list -keystore vendor.jks -storepass 111111 -v -alias key_alias

需求7:证书格式转换

例:从PEM到DER openssl x509 -inform PEM -in root.cer.pem -outform DER -pubkey -out root.cer.der

需求8:查看证书内部数据结构(ASN.1) cat root.cer.pem|openssl asn1parse -inform PEM -icat root.cer.der|openssl asn1parse -inform DER -i

需求9:RSA私钥签名、公钥验签、公钥加密、私钥解密

RSA加解密相关的操作,使用openssl rsautl命令。

该命令的参数分为如下几个部分(我们不关心关于输入输出文件的参数,因为我们使用标准输入和输出): key文件 -inkey file key类型 [|-pubin|-certin] key格式 -keyform [PEM|DER] 操作 [-sign|-verify |-encrypt|-decrypt] 填充格式 [-pkcs|-oaep |-ssl|-raw] 输出格式 [|-hexdump|-asn1parse]

指定key的文件名 默认: 私钥 PEM(默认): 即二进制格式经过base64之后 加上形同----BEGIN PUBLIC KEY---- 的表征key类型的头和尾 -sign 私钥签名 (签名只能使用-pkcs 和-raw这两种填充) -pkcs(默认): PKCS#1 v1.5 填充 -hexdump: 16进制输出

可为私钥、公钥或证书 -pubin: 公钥 DER: 即ASN.1二进制格式, 可用openssl asn1parse 理解其内部数据结构 -verify 公钥验签 (输出为被加签内容) -oaep: PKCS#1 OAEP -ans1parse: 对于-verify的场合常用, 用于理解PKCS系列 ASN.1格式的证书。

-certin: 证书 -encrypt 公钥加密 -ssl:   SSL v2 中使用的 向后兼容填充

-decrypt 私钥解密 -raw:   不做任何填充

其中-sign和-verify成对使用,-encrypt和-decrypt成对使用。

需求10:查看pfx的内部信息 openssl pkcs12 -info -in root.pfx

输入密码之后,证书、私钥,均以PEM的格式打印出来,可以直接另存为对应的文件,相当于导出。

需求12:jks导出银行公钥 keytool -export -alias cfca_pca -keystore cebmerchant.jks  -file cfca_pca.cer  -storepass 111111

需求13:如何对base64、hex、decimal和binary之间进行转换

binary->base64 echo -n $binary|openssl base64

上面命令的缺点是,它会自动换行,可以手工拼接,也可以采用如下命令直接获得不自动换行的base64: echo -n $binary|ruby -rbase64 -e '$stdin.binmode;$stdout.binmode;y = Base64.encode64($stdin.read); $stdout.write y'

base64->binary echo -n $base64|openssl base64 -d

上面命令的缺点是,它只接受有自动换行(每64个字符)的base64,可以手工换行,也可以采用如下命令直接解码: echo -n $base64|ruby -rbase64 -e '$stdin.binmode;$stdout.binmode;y = Base64.decode64($stdin.read); $stdout.write y'

binary->hex echo -n $binary|xxd -p -c 256

hex->binary echo -n $hex|xxd -p -r

decimal->hex

设decimal为10; echo 'obase=16; 10'|bc

hex->decimal

设hex为 a; echo 'ibase=16; A'|bc

注意要大写

怎么做大小写转换? tr '[:lower:]' '[:upper:]'

需求13:如何用命令行模拟ssl双向连接

若用openssl s_client pstree -pa|grep -F "nc" -B 1|grep -F "12380" -B 1|grep -v grep|grep bash|awk -F"," '{print $2}'|xargs kill -9while true; do nc -l -p 12380 |openssl s_client -debug -msg -cert tc-cer.pem -key tc-pri.pem -quiet -connect 127.0.0.1:11443; done

若用wget wget --server-response --timeout=10 --append-output=xxx.log --debug --header='Host: www.domain.com' --post-data='blah=blah' --post-file=FILE --no-check-certificate --certificate=root.cer.pem --certificate-type=PEM --private-key=root.pri.pem --private-key-type=PEM https://127.0.0.1:443/

若用curl curl --data "blah=blah" --insecure --key root.pri.pem --key-type PEM --pass PASS --cert root.cer.pem --cert-type PEM --max-time 10 --header "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" "http://domain/url"

参考文献 2011-06-11

Published under (CC) BY-NC-ND tagged with 技巧

comments powered by Disqus

<think>我们正在讨论DERPEM格式的数字证书区别。根据引用[1]引用[2]的信息,我们可以总结如下: 1. **编码方式**: - **DER (Distinguished Encoding Rules)**:使用二进制编码,是ASN.1标准定义的一种编码方式。扩展名通常为`.der`或`.cer`。 - **PEM (Privacy Enhanced Mail)**:使用Base64编码的ASCII文本,通常以`-----BEGIN CERTIFICATE-----`开头,以`-----END CERTIFICATE-----`结尾。扩展名通常为`.pem`。 2. **文件内容**: - DER格式是纯二进制,无法直接用文本编辑器查看。 - PEM格式是文本格式,可以直接用文本编辑器查看编辑。 3. **使用场景**: - DER格式常用于Java平台Windows系统。 - PEM格式常用于OpenSSL、Apache、Nginx等Unix/Linux系统下的软件。 4. **互转换**: - DERPEM可以互相转换。例如,使用OpenSSL命令: - PEM转DER:`openssl x509 -in cert.pem -outform der -out cert.der` - DER转PEM:`openssl x509 -inform der -in cert.der -out cert.pem` 5. **存储内容**: - 两种格式都可以存储证书私钥证书链等。但PEM格式通常可以包含多个项目(如证书私钥)在同一文件中,通过不同的首尾标签区分,而DER通常只存储一个项目。 6. **引用说明**: - 引用[1]指出:DER格式PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der,但也经常使用.cer用作扩展名,所有类型的认证证书私钥都可以存储为DER格式。Java使其典型使用平台[^1]。 - 引用[2]指出:PKCS#7PKCS#12使用的都是公钥证书。PKCS#7的SignedData的一种退化形式可以分发公钥证书CRL,一个SignedData可以包含多张公钥证书。而PKCS#12可以包含公钥证书及其私钥,也可包含整个证书链[^2]。 因此,主要区别在于编码方式(二进制 vs 文本)可读性。 ### 相关问题 1. 如何将DER格式证书转换为PEM格式? 2. OpenSSL命令行工具中还有哪些常用的证书格式转换命令? 3. 在Linux系统中,如何查看PEM格式证书的内容? 4. 为什么Java平台更倾向于使用DER格式? 5. 如何判断一个证书文件是DER格式还是PEM格式? [^1]: 不同证书格式Der 、Cer 、PfxPem区别 [^2]: 各种数字证书区别</think>### DER 格式PEM 格式数字证书区别 根据引用内容[^1][^2],DER PEM 是两种常见的数字证书编码格式,主要区别如下: | **特征** | **DER 格式** | **PEM 格式** | |----------------|----------------------------------------|------------------------------------------| | **编码方式** | 二进制编码(ASN.1 标准) | Base64 编码的 ASCII 文本 | | **文件扩展名** | `.der` 或 `.cer` | `.pem` 或 `.crt` | | **可读性** | 二进制文件,不可直接阅读 | 文本文件,可文本编辑器打开阅读 | | **文件结构** | 无分隔符的纯二进制数据 | 有明确的首尾标识符:<br>`-----BEGIN CERTIFICATE-----`<br>`-----END CERTIFICATE-----` | | **平台兼容性** | Java 平台常用,Windows 系统支持 | OpenSSL/Apache/Nginx 等 Unix/Linux 系统常用 | | **存储内容** | 可存储证书私钥证书链等 | 可存储证书私钥证书链等 | | **转换关系** | DER → PEM:Base64 编码<br>PEM → DER:Base64 解码 | | #### 关键区别说明: 1. **编码本质** - DER 是证书的原始二进制格式(ASN.1 DER 编码) - PEM 是 DER 的 Base64 编码版本,添加了文本分隔符 2. **使用场景** - **DER**:Java 应用、Windows 证书导入、硬件设备嵌入式系统 - **PEM**:OpenSSL 命令行操作、Apache/Nginx 配置、SSH 密钥 3. **转换示例** 通过 OpenSSL 互转: ```bash # DER 转 PEM openssl x509 -inform der -in cert.der -out cert.pem # PEM 转 DER openssl x509 -outform der -in cert.pem -out cert.der ``` 4. **文件内容对比** **DER 文件**(十六进制查看): ``` 30 82 03 21 30 82 02 09 A0 03 02 01 02... ``` **PEM 文件**(文本查看): ```pem -----BEGIN CERTIFICATE----- MIIFazCCBFOgAwIBAgISA5qE0bA6r5X5X9vQo1zOQ0kTMA0GCSqGSIb3DQEBCwUA ... KoZIzj0EAwMDLzAtMCsGA1UdEQQkMCKCEG15LWRvbWFpbi5jb22CDnd3dy5teS1k -----END CERTIFICATE----- ``` > 引用说明:DER 使用二进制编码而非 Base64 的 ASCII,Java 平台是其典型使用场景[^1]。PEM 格式在 PKCS#7/PKCS#12 等标准中常用于分发公钥证书证书链[^2]。 --- ### 相关问题 1. 如何通过 OpenSSL 命令行工具验证 DER 证书的有效性? 2. 在 Java 应用中如何处理 PEM 格式证书? 3. 证书链在 DER PEM 格式中如何存储? 4. 为什么 OpenSSL 库更倾向于使用 PEM 格式? 5. 如何编程实现 DER PEM 证书的相互转换? [^1]: 不同证书格式Der 、Cer 、PfxPem区别 [^2]: 各种数字证书区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值