从cer证书和csr公钥中读取证书信息(完整)

1 篇文章 0 订阅
1 篇文章 0 订阅

最近项目(c#)使用了openssl颁发证书,在项目开发过程中,dn(证书信息)由后台生成,用户拿到dn值使用openssl生成证书,系统后台加签,用户得到完整证书,其中后台存在校验csr和cer的证书信息的环节,并且通过下面方法可以获取数字证书颁发者和持有者的名称信息,归纳总结如下,以供大家参考。

首先弄清楚几个概念:

KEY 通常指私钥。

CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。

CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.

X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。

OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.

下面是用c#读取cer.csr的dn值信息,注意这里的csr和cer都是base64格式的字符串
1.读取cer
 使用System.Security.Cryptography.X509Certificates类库
 byte[] rawData = System.Text.Encoding.Default.GetBytes(cer);
                    X509Certificate2 x = new X509Certificate2(rawData);  
                    string dn2 = x.Subject;
               
2.读取csr
  使用CERTENROLLLib类库
   CX509CertificateRequestPkcs10 csrRequest = new CX509CertificateRequestPkcs10();
                    csrRequest.InitializeDecode(csr, EncodingType.XCN_CRYPT_STRING_BASE64_ANY);
                    csrRequest.CheckSignature();
                    string dn2 = csrRequest.Subject.Name;
          
              

要替换cer格式证书公钥,你需要先生成一个新的公钥,并将其写入到新的证书。具体步骤如下: 1. 读取证书 使用Java的证书类库,通过`CertificateFactory`类的`generateCertificate()`方法读取证书。例如: ``` CertificateFactory cf = CertificateFactory.getInstance("X.509"); FileInputStream fis = new FileInputStream("original.cer"); X509Certificate cert = (X509Certificate) cf.generateCertificate(fis); fis.close(); ``` 2. 生成新的公钥 使用Java的密钥类库,通过`KeyPairGenerator`类的`generateKeyPair()`方法生成新的公私钥对。例如: ``` KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC"); kpg.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = kpg.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); ``` 这里使用了SM2椭圆曲线加密算法生成了新的公钥。 3. 生成新的证书 将新的公钥写入到新的证书。这里使用Bouncy Castle库的`JcaX509v3CertificateBuilder`类来生成新的证书。例如: ``` X500Name issuer = new X500Name("CN=Original Certificate"); X500Name subject = new X500Name("CN=New Certificate"); BigInteger serial = BigInteger.valueOf(System.currentTimeMillis()); JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(issuer, serial, cert.getNotBefore(), cert.getNotAfter(), subject, publicKey); ContentSigner contentSigner = new JcaContentSignerBuilder("SM3withSM2").setProvider("BC").build(keyPair.getPrivate()); X509Certificate newCert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certBuilder.build(contentSigner)); ``` 这里使用了SM3哈希算法和SM2签名算法生成新的证书。 4. 保存新的证书 将新的证书保存到文件。例如: ``` FileOutputStream fos = new FileOutputStream("new.cer"); fos.write(newCert.getEncoded()); fos.close(); ``` 这样,你就成功将新的公钥写入到了新的证书,并保存到了文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值