ASN.1 編碼關閉 RSASSA-PSS 預設參數
我不完全確定這個問題屬於加密而不是stackoverflow,但是……
問題在於X509 證書中RSASSA-PSS預設算法標識符參數的編碼。
在測試案例中,我們使用 PSS 的預設參數生成證書,並嘗試將該證書導入 hsm。
hsm 的 pkcs#11 驅動程序周圍的 jca 包裝器庫拒絕證書並出現異常 ala
Wrong parameters for an RSAandMGF1 algorithm identifier
有問題的證書是使用 bouncy castle 生成的,可以使用 openssl 進行驗證。問題是證書中的算法標識符參數是一個空序列。
RFC3447 A.2.2.3聲明如下:
The parameters field associated with this OID in a value of type AlgorithmIdentifier shall have a value of type RSASSA-PSS-params: RSASSA-PSS-params ::= SEQUENCE { hashAlgorithm [0] HashAlgorithm DEFAULT sha1, maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1, saltLength [2] INTEGER DEFAULT 20, trailerField [3] TrailerField DEFAULT trailerFieldBC }
幾段之後:
If the default values of the hashAlgorithm, maskGenAlgorithm, and trailerField fields of RSASSA-PSS-params are used, then the algorithm identifier will have the following value: rSASSA-PSS-Default-Identifier RSASSA-AlgorithmIdentifier ::= { algorithm id-RSASSA-PSS, parameters RSASSA-PSS-params : { hashAlgorithm sha1, maskGenAlgorithm mgf1SHA1, saltLength 20, trailerField trailerFieldBC } } RSASSA-AlgorithmIdentifier ::= AlgorithmIdentifier { {PKCS1Algorithms} }
因此,充氣城堡似乎遵循 ASN.1 定義並為預設值返回一個空序列。但是,如果我閱讀了最後一部分,在我看來,他們仍然需要設置預設值,而且我們需要使用的庫似乎強制執行了這一點。
因此,在寫支持票之前,我只想問一下我是否確實錯過了 rfc 中的某些內容,或者證書確實無效。
充氣城堡是正確的。Bouncy Castle 包含一個 BER/DER 編碼器,它通過顯式編碼方式將 ASN.1 對象更改為編碼 - 據我所知,手動進行。由於此結構使用區分編碼規則 (DER) 表示,因此該結構應為空。DER 使用最少的字節數對值進行編碼。
DEFAULT ASN.1 值——就像 XSD 模式中的 XML 預設值一樣——應該在解析結構時填寫。因此 HSM 應該在解析數據時自動替換這些值。如果它不包含功能齊全的 ASN.1 解析器,則可能需要對其進行顯式編碼(使其相對容易受到實現錯誤的影響)。
由於我目前在家,我將使用古老的“ASN.1、BER 和 DER 子集的外行指南”,而不是直接引用 ITU-T X.690 / ISO/IEC 8825-1 規範:
內容八位字節與 BER 編碼相同,除瞭如果具有 DEFAULT 限定符的組件的值為預設值,則該組件的編碼不包含在內容八位字節中。
請注意,該引號用於對 SEQUENCE 進行編碼。