Openssl和PKCS#11的故事

1.1   What to do

通过Openssl和PKCS#11接口,使用USBKEY中的私钥和证书来签发一个下级证书。

1.2              背景

数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步 骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。

 

 

 

 

一个标准的X.509数字证书包含以下一些内容:

证书的版本信息;

证书的序列号,每个证书都有一个唯一的证书序列号;

证书所使用的签名算法;

证书的发行机构名称,命名规则一般采用X.500格式;

证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;

证书所有人的名称,命名规则一般采用X.500格式;

证书所有人的公开密钥;

证书发行者对证书的签名。

 

简而言之,CA从PKCS#10证书请求(或者P7格式)中读取用户信息和公钥信息,使用这些信息封装成一个X.509格式(可能是不同版本,比较 普遍是V3),此时唯一没有包括的是证书发行者对证书的签名,此时使用CA的私钥进行签名,得到签名值后CA将其填充到X.509相对应的结构中去,一个 X.509证书宝宝就此诞生了。

 

此处唯一不同的是CA的公私钥对和证书都存放在USBKEY中(当然也能存放在加密机或加密卡中),所以将通过USBKEY的PKCS#11接口完成上述操作,而证书相关操作就由Openssl代劳了。

 

1.3              正题

第一、使用Usbkey向某个CA申请一个证书

通过下面的命令来验证,第一组公私钥对和证书是签名证书,第二组是加密证书。可以很明显地看出他们是通过Csp方式操作整个证书申请过程的。

C:\Program Files\Smart card bundle>pkcs11-tool.exe --module DMPKCS11.dll –O

Certificate Object, type = X.509 cert

label:      cert addey by CSP

ID:         37af001ddbd525e640ca3c3f6d78b009741d1f48

Public Key Object; RSA 1024 bits

label:      pub key addey by CSP

ID:         37af001ddbd525e640ca3c3f6d78b009741d1f48

Usage:      encrypt, verify

Private Key Object; RSA

label:      private key addey by CSP

ID:         37af001ddbd525e640ca3c3f6d78b009741d1f48

Usage:      decrypt, sign

Certificate Object, type = X.509 cert

label:      cert addey by CSP

ID:         ab268f4320a426b4a6ce70d757cd11fcd83b8ddd

Public Key Object; RSA 1024 bits

label:      pub key addey by CSP

ID:         ab268f4320a426b4a6ce70d757cd11fcd83b8ddd

Usage:      encrypt, verify

Private Key Object; RSA

label:      private key addey by CSP

ID:         ab268f4320a426b4a6ce70d757cd11fcd83b8ddd

Usage:      decrypt, sign

 

第二、生成PKCS#11的证书请求

这里直接使用Java程序生成一个证书请求。

import java.io.OutputStreamWriter;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

 

import javax.security.auth.x500.X500Principal;

 

import org.bouncycastle.jce.PKCS10CertificationRequest;

import org.bouncycastle.openssl.PEMWriter;

 

/**

* Generation of a basic PKCS #10 request.

*/

public class PKCS10CertRequestExample

{

    public static PKCS10CertificationRequest generateRequest(

        KeyPair pair)

        throws Exception

    {

        return new PKCS10CertificationRequest(

                "SHA256withRSA",

                new X500Principal("C=CN,ST=上海,L=上海,O=火星,OU=北极,CN=超人"),

                pair.getPublic(),

                null,

                pair.getPrivate());

    }

   

    public static void main(

        String[]    args)

        throws Exception

    {

        // create the keys

        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");

        kpGen.initialize(1024, Utils.createFixedRandom());

        KeyPair          pair = kpGen.generateKeyPair();

        PKCS10CertificationRequest request = generateRequest(pair);

        PEMWriter        pemWrt = new PEMWriter(new OutputStreamWriter(System.out));

        pemWrt.writeObject(request);

        pemWrt.close();

    }

}

 

 

证书请求

-----BEGIN CERTIFICATE REQUEST-----

MIIBoDCCAQkCAQAwYjEPMA0GA1UEAwwG6LaF5Lq6MQ8wDQYDVQQLDAbljJfmnoEx

DzANBgNVBAoMBueBq+aYnzEPMA0GA1UEBwwG5LiK5rW3MQ8wDQYDVQQIDAbkuIrm

tbcxCzAJBgNVBAYTAkNOMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCw7iyU

/8p1lCxnJifdqxNYO1cTVg35BBtscQsrtug9Br3Vge/kNX9KC5xOGhdcK1IDjl3d

1CGsRtnb4dEFqtkjKWQ1z5WZxXWoVfkqwP3AJg8y10BhiiDqPPbn3II4o8Nc+bvz

tDm32HbNXcyXWLR5aEJx1FiJYdDmDbRbgGrcawIDAQABMA0GCSqGSIb3DQEBCwUA

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值