CMP协义中私钥和证书是要加密传输的,但是CMP所用的传输协议并不要求加密,所以CMP专门定义敏感信息的加密方式。
CMP V2
CMP V2中使用EncryptedValue结构来加密,通常是使用CA的RSA公钥来加密内容,这就导致所有的CA证书都是用RSA签名的,因为用其它签名算法会导致不能使用CMP或其它兼容性问题。
EncryptedValue数据结构,由PKCS#11 v2.11版本12.11节定义。PKCS#11 v2.11中只提到了可以用一个密码对私钥进行包装,并没有提到密码的来源。在PKCS#11 v2.40中定义了CKM_RSA_AES_KEY_WRAP和CKM_ECDH_AES_KEY_WRAP两种包装机制,分别使用RSA公钥和ECDH派生密钥再结合AES来包装私钥。对于CKM_ECDH_AES_KEY_WRAP机制现实中应该很少有工具实现,而且CMPV2发布时还没有定义CKM_ECDH_AES_KEY_WRAP。这就导致CA证书只能使用RSA签名,带来了不少兼容性问题。
PKCS#11 3.1:
https://docs.oasis-open.org/pkcs11/pkcs11-spec/v3.1/os/pkcs11-spec-v3.1-os.html
PKCS#11 2.11:
https://www.cryptsoft.com/pkcs11doc/v211/
CMP V3
CMP V3中使用EnvelopedData结构加密,Enveloped-data结构是在CMS标准中定义的。
RFC 3370定义了Ephemeral-Static Diffie-Hellman,Static-Static Diffie-Hellman,RSA算法的用于CMS的EnvelopedData
RFC 5753定义了ephemeral-static ECDH, ephemeral-static ECDH,1-Pass ECMQV算法的用于CMS的EnvelopedData
RFC 8418定义了X25519,X448算法的用于CMS的EnvelopedData
RFC 5652定义Cryptographic Message Syntax,其中定义了Enveloped-data数据结构。CMS由PKCS #7 1。5演进而来.
CMP V3中指定了3种方法:
* recipient’s certificate with an algorithm identifier and a public
key that supports key transport and where any given key usage
extension allows keyEncipherment: The content-encryption key will
be protected using the key transport key management technique, as
specified in Section 6.2.1 of CMS [RFC5652].
- recipient’s certificate with an algorithm identifier and a public
key that supports key agreement and where any given key usage
extension allows keyAgreement: The content-encryption key will be
protected using the key agreement key management technique, as
specified in Section 6.2.2 of CMS [RFC5652]. -
a password or shared secret: The content-encryption key will be
protected using the password-based key management technique, as
specified in Section 6.2.4 of CMS [RFC5652].
翻译过来分别是具有keyEncipherment标志位证书,具体keyAgreement标志位的证书,密码加密。
目前据我所知nist,secp,brainpool系列的曲线支持digitalSignature和keyAgreement,SM2支持所有三种用途,ed25519/448仅支持digitalSignature,x25519/448仅支持keyAgreement,cruve25519这种把digitalSignature和keyAgreement分开的设计使其不适合用于CA证书。通过ECIES可以让支持keyAgreement的ECC都支持keyEncipherment,其实SM2加密时也是一种特殊的ECIES(X9.63标准)。目前支持ECIES的加密程序库并不多,只有bouncy castle,crypto++支持,也就是用ECC算法实现keyEncipherment还不太现实。
其实所有的加密方案都不是由CMP定义的,面是直接使用了其它标准中的机制。
参考:
https://webstore.ansi.org/preview-pages/ASCX9/preview_ANSI+X9.63-2001.pdf
https://webstore.ansi.org/preview-pages/ASCX9/preview_ANSI+X9.63-2011+(R2017).pdf
https://csrc.nist.gov/CSRC/media/Events/Key-Management-Workshop-2000/documents/x963_overview.pdf