如何用openssl pkcs12软件生成pkcs#10

pkcs #10 openssl x.509 v3 v4 网络安全_中华文本库
第1页/共10页
1 PKCS #10 PKCS 最初是为推进公钥密码系统的互操作性,由 RSA 实验室与工业界、学术界和政府代表 合作开发的。在 RSA 带领下,PKCS 的研究随着时间不断发展,它涉及了不短发展的 PKI 格 式标准、算法和应用程序接口。PKCS 标准提供了基本的数据格式定义和算法定义,它们实 际是今天所有 PKI 实现的基础。 PKCS #10:证书请求语法标准。PKCS #10 定义了证书请求的语法。证书请求包含了一个唯一 识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的 PKIX 证书请求消息就是一个 PKCS #10) 。 PKCS 的标准主要用于用户实体通过 RA 的证书申请、用户的证书更新过程。当证书作废时, RA 通过 CA 向目录服务器中发布证书撤销列表 CRL,用于扩展证书内容,以及数字签名与验 签过程和实现数字信封格式定义等一系列相关协议。 2 openssl 证书申请与生成 首先在网上搜一些安装配置的步骤。在安装时,遇到很多问题。可能是对 DOS 命令行的很 多命令、机理都不了解,在安装这一步花了不少时间。遇到一个错误就 GOOGLE,然后变为 下一个错误,继续 GOOGLE。最终总算安装配置成功了。 然后开始做证书申请部分。 首先在 D 盘建立一个目录 SSL。 创建 CA。 为 CA 创建一个 RSA 私钥。
利用 CA 的 RSA 私钥创建一个自签名的 CA 证书, 命令如下: openssl req –new –x509 –days 3650 –key ca.key –out ca.crt ╢ 这 里 需 要 注 意 的 是 参 数 -f , 这 是 用 到 配 置 文 件 f 我 在 D:\openssl-0.9.8q\apps 目录下找到了这个配置文件。将这个文件 COPY 到 d:\SSL 目录下。然 后用 Ultraedit 打开 f,对以下几项做修改。 (1)dir 的值根据实际必须是“.”代表的是当前工作目录,从这个目录中载入 f 配置文件。 (2)certs 的值表示已发行的证书和证书请求存放的目录,可以在 SSL 目录下新建一个名为 certs 的目录,将来生成的请求证书就会自动存放在 certs 目录里。 (3) crl_dir 的值表示撤销证书的存放目录。 这里不涉及撤销证书, 对此项的值不需要修改。 (4)database 的值指明记录已经发行证书数目的文件 index.txt 的位置。必须在 SSL 目录下 建立一个名为 index.txt 的文件。 (5) new_certs_dir 指明签发证书存放的位置, 根据情况在 SSL 目录下新建一个名为 newcerts 的目录。将来生成的证书就会自动保存到这个目录里。 (6)certificate 指明 CA 证书文件所在的目录以及文件名。根据实际情况修改为$dir/ca.crt,
现在还没有 ca.crt 这个证书文件,下面会创建,这里先把配置文件改好。 (7) serial 指明序列号文件所在的位置。 每创建一个证
第1页/共10页
寻找更多 ""PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准。
可以到官网上看看
PKCS 目前共发布过 15 个标准:(1)PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义了PSA公/私钥的语法。(2)PKCS#2:涉及了RSA的消息摘要加密,这已被并入PKCS#1中。(3)PKCS#3:Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie- Hellman密钥协议的方法。(4)PKCS#4:最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。(5)PKCS#5:基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述)。(6)PKCS#6:扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法(当PKCS#6第一次发布时,X.509还不支持扩展。这些扩展因此被包括在X.509中)。(7)PKCS#7:密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。PKCS#7提供了许多格式选项,包括未加密或签名的格式化消息、已封装(加密)消息、已签名消息和既经过签名又经过加密的消息。(8)PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。(9)PKCS#9:可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter signature)、质询口令字和扩展证书属性。(10)PKCS#10:证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。(11)PKCS#11:密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。(12)PKCS#12:个人信息交换语法标准。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。(13)PDCS#13:椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。(14)PKCS#14:伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。(15)PKCS#15:密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。
X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。1988年首次发布,1993年和1996年两次修订。当前使用的版本是X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案.
PKCS#7 常用的后缀是: .P7B .P7C .SPC
PKCS#12 常用的后缀有: .P12 .PFX
X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT
X.509 PAM 编码(Base64)的后缀是: .PEM .CER .CRT
.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
一 用openssl创建CA证书的RSA密钥(PEM格式):openssl genrsa -des3 -out ca.key 1024
二用openssl创建CA证书(PEM格式,假如有效期为一年):openssl req -new -x509 -days 365 -key ca.key -out ca.crt -fopenssl是可以生成DER格式的CA证书的,最好用IE将PEM格式的CA证书转换成DER格式的CA证书。
三 x509到pfxpkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx
四 PEM格式的ca.key转换为Microsoft可以识别的pvk格式。
pvk -in ca.key -out ca.pvk -nocrypt -topvk
五 PKCS#12 到 PEM 的转换openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem验证 openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
六 从 PFX 格式文件中提取私钥格式文件 (.key)openssl pkcs12 -in mycert.pfx -nocerts -nodes -out mycert.key
七 转换 pem 到到 spcopenssl crl2pkcs7 -nocrl -certfile venus.pem
-outform DER -out venus.spc用 -outform -inform 指定 DER 还是 PAM 格式。例如:openssl x509 -in Cert.pem -inform PEM -out cert.der -outform DER
八 PEM 到 PKCS#12 的转换,openssl pkcs12 -export -in Cert.pem -out Cert.p12 -inkey key.pem
密钥库文件格式【Keystore】
JKS 扩展名
: .jks/.ks 描述
: 【Java Keystore】密钥库的Java实现版本,provider为SUN 特点
密钥库和私钥用不同的密码进行保护
JCEKS 扩展名
: 【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 描述
: 【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用于保存公钥
浏览: 578747 次
来自: 深圳
哈哈,都不错。
还可以查到sql
呵呵,真的不错。
dx&=this.length
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Thoughts, stories and ideas
致力于前端技术学习研究
Linux系统教程,运维经验分享2013年10月 移动开发大版内专家分月排行榜第三
2013年3月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。openssl之数字证书签名,CA认证原理及详细操作
公钥密码体系,又称非对称密码体系。它使用二个密钥,一个用于加密信息,另一个用于解密信息。
这二个密钥间满足一定数学关系,以至用二个密钥中的任何一个加密的数据,只能用另外一个进行数据解密。每个用户拥有二个密钥,一个被称之为公钥,另一个被称之为私钥,并将公钥分发给其它用户。由于这二个密钥间的数学关系,
任何收到该用户公钥的其它用户可以保证发送用此公钥进行加密的数据只有该用户用自己的私钥才能进行解密。
当然此项保证是建立在用户私钥的私有性基础之上。目前最著名的公钥密码算法为算法,它是由、和共同发明的。见图示:
摘要算法是一种方法,它将一个任意长度的数据变换为一个定长的数据串,这一定长的数据串被称为消息摘要,也有数据指纹之称。合格的摘要算法必须满足下列条件:
找出具有相同摘要的消息集合在技术上是不可能的;
对一给定的消息摘要,反向计算出消息本身在技术上是不可行的。
数据发送方在数据发送前,首先用摘要算法对数据计算消息摘要,然后将数据和消息摘要一起发送给接受方。接受方用相同的摘要算法对数据重新计算消息摘要,通过对二个消息摘要的比较,可以明确地判断出数据在传输过程中是否被篡改。结果相同表示数据未被修改,而结果不同表明数据被修改或数据被丢失,从而保证数据在传输过程中的完整性。常用的摘要算法有和,它是由实验室发明的,具体算法请参阅和。
数字签名实际上是非对称密码算法和消息摘要算法的一种组合应用,其目的在于:如某人张三对一段消息进行了数字签名,那么其它的人都能验证这个签名确实是张三签的,同时也能验证张三签名后数据是否被篡改。下面的例子将详细介绍Alice如何对一份合同M进行数字签名,同时Bob又是如何来验证她所签的合同。见图示:
数字签名示意图
Alice准备了一份合同M;
Alice用摘要算法计算出该合同M的消息摘要MD;
Alice用非对称算法和自己的私钥对合同消息摘要MD进行加密,该密文S就是合同的数字签名;
Alice将合同M和合同的数字签名S合并在一起,通过网络传送到合同的接受者Bob;
Bob收到Alice的合同M及合同的数字签名S;
Bob用Alice的公钥对合同签名S进行解密,得到Alice计算的合同摘要MD;
Bob采用相同摘要算法对收到的合同重新计算消息摘要MD';
Bob比较MD与MD'是否相等?
如结果相等,根据摘要算法的特性表明合同在传输过程中未被篡改。同时由于非对称加密算法的特性可以断定合同确实是Alice发送的,因为用Alice公钥能解密成功的数据只有Alice用她自己私钥对其进行加密才能产生,而她的私钥其它人是无法获取的。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际协议标准的证,并负责管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。所以需要向电子商务认证授权机构(CA, Certificate
Authority)申请签发公钥证书。
以在windows平台生成为例:
第一步,下载openSSL工具,
第二步,打开 openssl 文件夹下的 bin 文件夹,执行 openssl.exe 文件;
第三步,生成&RSA&私钥,输入genrsa -out rsa_private_key.pem
1024,此时,我们可以在 bin
文件夹中看到一个文件名为 rsa_private_key.pem 的文件,用&记事本打开它,可以看到-----BEGIN RSA PRIVATE
KEY-----开头,-----END RSA
PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的 RSA
私钥。(PHP签名需要原始私钥,JAVA需要对原始私钥做pkcs8转码后再去除开头和结尾)
第四步,创建证书请求。使用私钥生成一个证书请求,输入req -new -out cert.csr -key
private.pem,这里我们会要求输入国家、组织、姓名等信息,但是不会要求输入证书有效天数,因为证书有效天数是CA认证中心给我们的;然后我们会把这个生成好的cert.csr(Certificate Signing Request
(CSR):证书签名申请)发给CA认证中心,证书请求提交到CA认证中心后会得到一份证书。
(测试时,根据cert.csr生成自签署根证书,暂时不通过CA认证中心自行进行证书签名,这里用是x509
openssl x509 -req -in cert.csr -out public.der
-outform der -signkey private.pem -days 3650
//10年有效)
& function sign($data,$rsaPrivateKeyPem)
& //读取私钥文件
& $priKey =
file_get_contents($rsaPrivateKeyPem);
& //转换为openssl密钥,必须是没有经过pkcs8转换的私钥
openssl_get_privatekey($priKey);
& //调用openssl内置签名方法,生成签名$sign
& openssl_sign($data, $sign, $res);
& //释放资源
& openssl_free_key($res);
& //base64编码
& $sign = base64_encode($sign);
& return $
java.io.FileInputS
java.io.FileNotFoundE
java.io.IOE
java.io.InputS
java.nio.ByteB
java.nio.channels.FileC
java.security.InvalidKeyE
java.security.KeyF
java.security.NoSuchAlgorithmException;
java.security.S
java.security.SignatureE
java.security.cert.CertificateF
java.security.interfaces.RSAPrivateK
java.security.interfaces.RSAPublicK
java.security.spec.PKCS8EncodedKeyS
java.security.spec.X509EncodedKeyS
java.util.D
javax.crypto.BadPaddingE
javax.crypto.C
javax.crypto.IllegalBlockSizeException;
javax.crypto.NoSuchPaddingE
mons.codec.binary.Base64;
public class
RSASignatureService{
& private String algonrithm = "SHA1WithRSA";
& private RSAPublicKey publicK
& private RSAPrivateKey privateK
& public RSASignatureService(){
& public static void main(String[] args) throws
FileNotFoundException, Exception {
& RSASignatureService ser = new
RSASignatureService();
& ser.setPrivateKey(new
FileInputStream("E:/private_key_pkcs8.pem"));
& String sign = ser.sign("哈哈");
& System.out.println(sign);
& ser.setPublicKey(new
FileInputStream("E:/public_key.pem"));//设置公钥
& ser.setPublicDer(new
FileInputStream("E:/public.der"));//设置公钥证书
System.out.println(ser.verify(sign, "哈哈"));//验签
& String ecrypt =
ser.encrpt("哈哈");//私钥加密
& String s =
System.out.println(ser.decrypt(s));//公钥解密
& public String encrpt(String content) throws
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException{ &
// 使用默认RSA
& & & Cipher
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,
privateKey);
byte[] cipherData =
cipher.doFinal(content.getBytes());
signature=Base64.encodeBase64String(cipherData);
& public String decrypt(String sign) throws
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException{
& // 使用默认RSA
Cipher cipher =
Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,
publicKey);
byte[] output =
cipher.doFinal(Base64.decodeBase64(sign));
return new
String(output);
& public String sign(String content) throws
NoSuchAlgorithmException, InvalidKeyException,
SignatureException{
& Signature signature =
Signature.getInstance(algonrithm);
signature.initSign(privateKey);
signature.update( content.getBytes());
& & & byte[]
signed = signature.sign();
& & & return
Base64.encodeBase64String(signed);
& public boolean verify(String sign, String
content) throws NoSuchAlgorithmException, InvalidKeyException,
SignatureException{ &
& Signature signature =
Signature.getInstance(algonrithm);
& signature.initVerify(publicKey);
signature.update(content.getBytes());
& boolean bverify =
signature.verify(Base64.decodeBase64(sign));
& private static byte[] toByteArray(InputStream
in) throws IOException { &
FileChannel channel = &
FileInputStream fs = &
& & & try {
& & fs = (FileInputStream)
& & channel = fs.getChannel();
& & ByteBuffer byteBuffer =
ByteBuffer.allocate((int) channel.size());
((channel.read(byteBuffer)) & 0) {
& // do nothing &
& // System.out.println("reading");
& & return byteBuffer.array();
& & & } catch
(IOException e) { &
& & e.printStackTrace();
& & & } finally
& channel.close(); &
& & } catch (IOException e) {
& e.printStackTrace();
& fs.close(); &
& & } catch (IOException e) {
& e.printStackTrace();
public void
setPrivateKey(InputStream privateKeyResource) throws Exception
byte[] tmp =
toByteArray(privateKeyResource);
byte[] buffer =
Base64.decodeBase64(new String(tmp));
PKCS8EncodedKeySpec keySpec =
new PKCS8EncodedKeySpec(buffer);
KeyFactory keyFactory =
KeyFactory.getInstance("RSA");
privateKey = (RSAPrivateKey)
keyFactory.generatePrivate(keySpec);
public void
setPublicKey(InputStream publicKeyResource) throws Exception
byte[] tmp =
toByteArray(publicKeyResource);
byte[] buffer =
Base64.decodeBase64(tmp);
KeyFactory keyFactory =
KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec =
new X509EncodedKeySpec(buffer);
publicKey = (RSAPublicKey)
keyFactory.generatePublic(keySpec);
public void
setPublicDer(InputStream publicKeyResource) throws Exception
CertificateFactory of =
CertificateFactory.getInstance("X.509");
java.security.cert.Certificate
ceof = of.generateCertificate(publicKeyResource);
// 获取CA的公钥
publicKey = (RSAPublicKey)
ceof.getPublicKey();
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 openssl pkcs12 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信