X.509证书中的“签名算法”和“签名哈希算法”有什么区别?为什么它需要“签名哈希算法”?



编辑:

我正在用PHP 5.2创建X.509证书。 。当我将“ digest_alg”更改为“ md5”时,Microsoft Cert Tool的两个属性都更改为md5。因此,如以下一个答案中所述,这似乎是Microsoft证书工具的问题/发明。

更改为md5:

           $configs = array(
                            'config'             => 'test.cnf',
                            'digest_alg'         => 'md5',
                            'x509_extensions'    => 'v3_ca',
                            'req_extensions'     => 'v3_req',
                            'private_key_bits'   => 2048,
                            'private_key_type'   => OPENSSL_KEYTYPE_RSA,
                            'encrypt_key'        =>
                        );


结果:



#1 楼

这与Microsoft决定实施证书检查GUI的方式有关,而不是与证书的实际字段有关。现代证书中存在的大多数签名算法标识符都指定了公钥算法(在这种情况下为RSA)和摘要算法(在这种情况下为SHA-1)。到目前为止,标识符“ sha1RSA”很可能不准确,以至于Microsoft决定将其用于标准中称为sha1WithRSAEncryption OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) 5 }的标识符。证书的签名算法标识符中摘要算法标识符中的公共密钥算法标识符为PKCS#1 v2 RSASSA-PSS。
编辑:
因此,Microsoft通过遵循以下约定和X.509规范“签名算法”是指签名公钥算法和签名哈希算法的组合,但是,首先,它们用于这些组合的标识符是非标准的,其次,在大多数情况下添加签名哈希算法字段是多余的,并且通常不会反映实际的X.509格式。

评论


$ \ begingroup $
感谢您的回答。我已经编辑了我的问题。这似乎真的是微软的事情。
$ \ endgroup $
– HomeCoder
2012年3月9日15:35



$ \ begingroup $
这意味着:在现实世界中,只有“摘要算法”(用于创建证书的哈希值)和“公钥算法”(用于从上述哈希值中创建签名) )。如果有误,请更正。
$ \ endgroup $
– HomeCoder
2012年3月9日15:40

$ \ begingroup $
如果您查看启用了AlternateSignatureAlgorithm(Windows CA设置)的CA签署的证书,您会看到Signature哈希算法为sha1或sha256等,而Signature算法为RSASSA-PSS。如下@mfrankli所述,一个是签名前使用的哈希。
$ \ endgroup $
–garethTheRed
15年5月8日在8:09



$ \ begingroup $
RSASSA-PSS完全是完全不同的野兽。正确的表示不仅需要签名算法和签名哈希算法,还需要MGF算法和P Source的标识符。但是,这是无关紧要的。
$ \ endgroup $
–亨里克·赫尔斯特伦
15年5月9日在10:51

#2 楼

我相信SignatureAlgorithm是用于使用私钥对内容进行签名的算法,而SignatureHashAlgorithm用于在签名之前对内容进行哈希处理(以免签署太多数据,这是一个相对较慢的过程)。在这种情况下,很容易确定SignatureHashAlgorithm是SHA1,因为它是以SignatureAlgorithm的名义命名的,但是我想在某些情况下这不是真的。

评论


$ \ begingroup $
谢谢。我认为X.509证书中只使用了一个SignatureHashAlgorithm(又称“摘要算法”)和一个“公钥算法”。
$ \ endgroup $
– HomeCoder
2012年9月9日15:45