创建具有无效签名的 X.509 证书

信息安全 证书 openssl x.509
2021-08-29 16:16:07

使用OpenSSL创建具有有效签名X.509证书在 Internet 上都有很好的记录。有关于创建由他们自己签名的证书和由证书颁发机构(CA)签名的证书的说明但是如何创建带有无效签名的证书呢?

3个回答

创建具有无效签名的 X.509 证书的最简单方法是创建具有有效签名的证书,然后更改签名。如果您使用证书的 PEM 编码(带有“-----BEGIN CERTIFICATE-----”标头和 Base64 编码的证书),一个简单的文本编辑器就可以解决问题。

X.509 证书使用 ASN.1 并且签名值排在最后,如标准中所述

 Certificate  ::=  SEQUENCE  {
     tbsCertificate       TBSCertificate,
     signatureAlgorithm   AlgorithmIdentifier,
     signature            BIT STRING  }

例如,使用有效签名的证书:

-----BEGIN CERTIFICATE-----
MIIGgTCCBWmgAwIBAgIIP2loSeAn4ucwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwNTIyMTEyODU3WhcNMTQwODIwMDAwMDAw
WjBmMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEVMBMGA1UEAwwMKi5n
b29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQ80mW9KOdkTavOvJ
T8KdnZW/ClBvM2DNSYlXEjlHxLfN23DIgwfk7xnThlwyH4RTk4bhhtWtBTyR9Gh4
3BIE5aOCBBkwggQVMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCCAuIG
A1UdEQSCAtkwggLVggwqLmdvb2dsZS5jb22CDSouYW5kcm9pZC5jb22CFiouYXBw
ZW5naW5lLmdvb2dsZS5jb22CEiouY2xvdWQuZ29vZ2xlLmNvbYIWKi5nb29nbGUt
YW5hbHl0aWNzLmNvbYILKi5nb29nbGUuY2GCCyouZ29vZ2xlLmNsgg4qLmdvb2ds
ZS5jby5pboIOKi5nb29nbGUuY28uanCCDiouZ29vZ2xlLmNvLnVrgg8qLmdvb2ds
ZS5jb20uYXKCDyouZ29vZ2xlLmNvbS5hdYIPKi5nb29nbGUuY29tLmJygg8qLmdv
b2dsZS5jb20uY2+CDyouZ29vZ2xlLmNvbS5teIIPKi5nb29nbGUuY29tLnRygg8q
Lmdvb2dsZS5jb20udm6CCyouZ29vZ2xlLmRlggsqLmdvb2dsZS5lc4ILKi5nb29n
bGUuZnKCCyouZ29vZ2xlLmh1ggsqLmdvb2dsZS5pdIILKi5nb29nbGUubmyCCyou
Z29vZ2xlLnBsggsqLmdvb2dsZS5wdIIPKi5nb29nbGVhcGlzLmNughQqLmdvb2ds
ZWNvbW1lcmNlLmNvbYIRKi5nb29nbGV2aWRlby5jb22CDSouZ3N0YXRpYy5jb22C
CiouZ3Z0MS5jb22CDCoudXJjaGluLmNvbYIQKi51cmwuZ29vZ2xlLmNvbYIWKi55
b3V0dWJlLW5vY29va2llLmNvbYINKi55b3V0dWJlLmNvbYIWKi55b3V0dWJlZWR1
Y2F0aW9uLmNvbYILKi55dGltZy5jb22CC2FuZHJvaWQuY29tggRnLmNvggZnb28u
Z2yCFGdvb2dsZS1hbmFseXRpY3MuY29tggpnb29nbGUuY29tghJnb29nbGVjb21t
ZXJjZS5jb22CCnVyY2hpbi5jb22CCHlvdXR1LmJlggt5b3V0dWJlLmNvbYIUeW91
dHViZWVkdWNhdGlvbi5jb20wCwYDVR0PBAQDAgeAMGgGCCsGAQUFBwEBBFwwWjAr
BggrBgEFBQcwAoYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcyLmNydDArBggr
BgEFBQcwAYYfaHR0cDovL2NsaWVudHMxLmdvb2dsZS5jb20vb2NzcDAdBgNVHQ4E
FgQUZ+wFAJG6n8knT4i1EhyqBhTlMxgwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAW
gBRK3QYWG7z2aLV29YG2u2IaulqBLzAXBgNVHSAEEDAOMAwGCisGAQQB1nkCBQEw
MAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcyLmNy
bDANBgkqhkiG9w0BAQUFAAOCAQEAFId/P3amOfPZtGwUDvIZlfp4kUJ/Qr/y9KMc
syO7YdcO+mSwOarZtZ1UdB3zBJ3d7vn2Ld1G0TiqFW8vIZk1OtWtdMC6hFQuC21P
Papck9jRhLZO1Jx4uFbGQdWM25z+a1TzxaoULmhAN9FF38OFKcrZlb/Gf4uETYV7
mMFQ10GT6UBESCkvEsT4hgEONQ/wXiOxDgMrbXBBm67IfXJzxmpncPDG6o49Dqw4
F6Jkkotp7ca6OvBnTvi0hcd4qS/64c/+0SjjLsWFq04W/zRJAUvF7mt8yiZHmv8f
E+FdDynG49hiV4MhWpmLdY5xzOWqb7+xmPdo3947SoHe9ZO2Mg==
-----END CERTIFICATE-----

(这是谷歌的证书之一,希望他们不要介意。)

要将该证书转换为具有无效签名的证书,您只需在最后修改一个字母。不要触摸 '=' 符号(如果它们存在——当二进制数据长度不是 3 的倍数时,它们正在为 Base64 填充);为避免 BER 编码出现极其罕见的潜在问题,也不要修改紧接在这些等号(或数据结尾)之前的四个字母之一。为了实现您想要实现的目标,您可以将最后一个“Z”更改为另一个字母(例如,一个“Y”),这样最后一个数据行现在显示为:

E+FdDynG49hiV4MhWpmLdY5xzOWqb7+xmPdo3947SoHe9YO2Mg==

瞧!正确解码但签名无效的证书。

签名通常只是消息内容的加密散列。对内容或签名本身的任何更改都会使其无效。

签名无效有两种不同的方式。签名本身可能无法解码(当您尝试与签名者关联的公钥时,它无法正确解密)或者它无法匹配从输入生成的哈希但被有效解密。

对于前者,只需对签名数据本身进行任何随机更改,因为如果它解码为任何远程有效的东西,它将不会解码为原始哈希。

对于后者,只需更改证书正文中的任何值或字符。像添加空格或更改大小写这样简单的操作就足以使签名不匹配。

如果您正在测试证书行为,您还应该通过使用您正在测试的客户端不信任的根证书签署您自己的证书来测试具有有效签名但无效信任链的自签名证书的行为方式。

作为额外的奖励,请考虑解析生成的证书以验证您是否已成功破坏签名。我发现这个网站在处理 ASN1 结构时非常有用。这也将有助于确保您不会无意中破坏 ASN1 编码。

正确的证书

损坏的证书