如何在perl中验证RSA证书

时间:2018-03-24 01:00:23

标签: perl openssl rsa x509

如果给出签名的根证书,您如何验证证书?我到目前为止:

 $root_x509 = Crypt::OpenSSL::X509->new_from_string($root_key_data, FORMAT_ASN1);
 $root_key = Crypt::OpenSSL::RSA->new_public_key($x509->pubkey());  

 $other_x509 = Crypt::OpenSSL::X509->new_from_string($other_key_data, FORMAT_ASN1);
 $other_key = Crypt::OpenSSL::RSA->new_public_key($x509->pubkey());  

好的,那又怎样?我没有看到明显的$root_key->verify_certificate($other_x509); Crypt :: OpenSSL :: VerifyX509是唯一/最好的答案吗?该模块在编译和安装方面存在问题,但如果可行的话,我将继续这样做。但我觉得我错过了一些东西。

例如,看起来python有一个明显的API,相当于我在任何OpenSSL perl库中都看不到的那样:

trusted_store = X509Store()
trusted_store.add_cert(trusted_root)

try:
  X509StoreContext(trusted_store, itunes_cert).verify_certificate()
except X509StoreContextError as e:
  print("iTunes certificate invalid")

1 个答案:

答案 0 :(得分:0)

经过广泛的研究,除了Crypt :: OpenSSL :: VerifyX509(见上文)之外,最接近完整解决方案的是Net :: SSLeay,它有一大堆与openssl的低级绑定。他们最近补充说:

1.83 2018-01-06
    X509_STORE_CTX_new and X509_verify_cert

但文档很少,我无法通过相关的段错误。

相反,我手工验证了证书链:

  1. 使用Convert :: ASN1重新编码我已解码的tbsCertificate数据 在我的PKCS#7文件中(“tbs”是“待签名”)
  2. 从PCKS#7数据中获取签名
  3. 从签署此证书的证书中获取subjectPublicKeyInfo.subjectPublic Key
  4. 将其提供给$ signer_key = Crypt :: OpenSSL :: RSA-> new_public_key($ signer_key_pem);
  5. 然后执行$ signer_key->验证($ cert_as_signed,$ signature)
  6. 并重复链中的每个证书。

    检查每个证书的有效日期和扩展功能是其中的一部分。