ASN.1 签名结构

ASN.1 签名主要涉及两个两个 ASN.1 结构:

  1. AlgorithmIdentifier
  2. SignatureValue

AlgorithmIdentifier 结构如下:

AlgorithmIdentifier  ::=  SEQUENCE  {
    algorithm   OBJECT IDENTIFIER,
    parameters  ANY DEFINED BY algorithm OPTIONAL
}

SignatureValue 结构如下:

SignatureValue ::= BitString

ref: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.1.2


RSA


Algorithm Identifier

AlgorithmIdentifier  ::=  SEQUENCE  {
    algorithm   OBJECT IDENTIFIER,
    parameters  NULL // required
}

对于 algorithm, 常见的算法有这些:

  • 1.2.840.113549.1.1.2 md2WithRSAEncryption
  • 1.2.840.113549.1.1.4 md5WithRSAEncryption
  • 1.2.840.113549.1.1.5 sha1WithRSAEncryption
Example
ASN.1 (BASE64): MA0GCSqGSIb3DQEBCwUA
SEQUENCE
    algorithm OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption
    paramters ANY NULL

Signature

对于 RSA 类型来说, SignatureValue 结构的内容就是 RSA 签名的内容, 编码为 BitString 即可。

Example
ASN.1 (BASE64): A4IBAQBeeymPAzRcjSipAQOQ4aGsEs3STxudsZqiT6LjH4xAvaTeEz-2ZHu4Uhe7rLUReljQM76yCIu3zzX9sz7iDDimesJvVS_UB2ZW1Gnecz7NBXm2nALFKlq5Tsx4oboP9DM6mleDE1odyW131_ZXbJckgTEgK9oGVy7XcHr7G1YvvhCubDTKAKLpbpie6AvJLh3EEoIURPF6ZoEd_y4GGwG3NFm-fP9EXYpQwyhxA0XLRBVL_JJzEbxQC1bu3nstfkXelQcYfk0z1VeSttEAnvxD6jHFFfyJ3HkjXXKMkdfb8wqW31rnzE4t0AER5R-SVHNNXxOs9P0FDw7AgjTdWtgu
BIT STRING (2048 bit) 0101111001111011001010011000111100000011001…
Example Certificate

-----BEGIN CERTIFICATE-----
MIIGoTCCBYmgAwIBAgIQAov8BanblfnDTLVBUOVGDzANBgkqhkiG9w0BAQsFADBf
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMR4wHAYDVQQDExVHZW9UcnVzdCBDTiBSU0EgQ0EgRzEw
HhcNMjMxMTI3MDAwMDAwWhcNMjQxMjAzMjM1OTU5WjBrMQswCQYDVQQGEwJDTjES
MBAGA1UECAwJ5YyX5Lqs5biCMTMwMQYDVQQKDCrljJfkuqzliJvmlrDkuZDnn6Xn
vZHnu5zmioDmnK/mnInpmZDlhazlj7gxEzARBgNVBAMMCiouY3Nkbi5uZXQwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6mO3oVy5OrnqDmeiaEw64rLyc
84H+y0KeDtrVBRwHZ4QHk8bF4lyjs7t13MRZTWMqWuWgNirUzYDsAzIFGPXYlxdZ
xGjudP7PRwgtqY3OmxbfModcRZ2+UGFDBhWOocdqowhELQ+p+sS66eZXKKm3YJs/
a/lWxtk/rap3q0olPouG0iZkeJkaZ5Tsry6SxI3vlp7SZwlHhMZth0vgpwAPWjN6
l/VX6eW4rkA6sAEXLpGxS7/inivq7+tmRwNK326lCj2HDNUkOOrLkc4fZPG6D8xn
J+umJEOwU/NcANUA8Z/TZtbKuXoW4yl0qLbb7Hu/WHbKhfaxSxvu2IG99j1TAgMB
AAGjggNLMIIDRzAfBgNVHSMEGDAWgBSRn14xFa4Qn61gwffBzKpINC8MJjAdBgNV
HQ4EFgQUgMO19n1LDKXvq/VUrpam1t4JSqgwHwYDVR0RBBgwFoIKKi5jc2RuLm5l
dIIIY3Nkbi5uZXQwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYb
aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdQYDVR0fBG4wbDA0oDKgMIYuaHR0
cDovL2NybDMuZGlnaWNlcnQuY29tL0dlb1RydXN0Q05SU0FDQUcxLmNybDA0oDKg
MIYuaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0dlb1RydXN0Q05SU0FDQUcxLmNy
bDBvBggrBgEFBQcBAQRjMGEwIQYIKwYBBQUHMAGGFWh0dHA6Ly9vY3NwLmRjb2Nz
cC5jbjA8BggrBgEFBQcwAoYwaHR0cDovL2NybC5kaWdpY2VydC1jbi5jb20vR2Vv
VHJ1c3RDTlJTQUNBRzEuY3J0MAwGA1UdEwEB/wQCMAAwggF9BgorBgEEAdZ5AgQC
BIIBbQSCAWkBZwB1AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAAB
jA9wblcAAAQDAEYwRAIgHPp6rU1wSLK8j9/dW6zfCMyq6/rDLsAoPUrb7DFmyswC
ICn+b7q0z27jibVxv0L5Sox3oBs1DK+ZgxNuXjPb71ArAHYASLDja9qmRzQP5WoC
+p0w6xxSActW3SyB2bu/qznYhHMAAAGMD3BuUgAABAMARzBFAiAxgJcYb+u+ORXf
q5XC70iPOM3Z8jSeT2V0uhg/0zlT/AIhAJXZv+9kDz676m0h/IY4jbmkfgNHXbEC
vTM/SckyfeRrAHYA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGM
D3BuLwAABAMARzBFAiBQuQohZVs7PwOrfxMV4M6h0sBvYu67u0NMw2y2jxJy1wIh
ALxVr9Td+TGlYGpUG7n5OSN9wey17oB+BMl+AnMyy2owMA0GCSqGSIb3DQEBCwUA
A4IBAQBeeymPAzRcjSipAQOQ4aGsEs3STxudsZqiT6LjH4xAvaTeEz+2ZHu4Uhe7
rLUReljQM76yCIu3zzX9sz7iDDimesJvVS/UB2ZW1Gnecz7NBXm2nALFKlq5Tsx4
oboP9DM6mleDE1odyW131/ZXbJckgTEgK9oGVy7XcHr7G1YvvhCubDTKAKLpbpie
6AvJLh3EEoIURPF6ZoEd/y4GGwG3NFm+fP9EXYpQwyhxA0XLRBVL/JJzEbxQC1bu
3nstfkXelQcYfk0z1VeSttEAnvxD6jHFFfyJ3HkjXXKMkdfb8wqW31rnzE4t0AER
5R+SVHNNXxOs9P0FDw7AgjTdWtgu
-----END CERTIFICATE-----

ref: https://datatracker.ietf.org/doc/html/rfc3279#section-2.2.1


RSASSA-PSS


Algorithm Identifier

当使用 RSASSA-PSS 作为 Algorithmidentifier 时, parameter 字段的结构应该为 RSASSA-PSS-Params.

RSASSA-PSS-params  ::=  SEQUENCE  {
         hashAlgorithm      [0] HashAlgorithm DEFAULT
                                   sha1Identifier,
         maskGenAlgorithm   [1] MaskGenAlgorithm DEFAULT
                                   mgf1SHA1Identifier,
         saltLength         [2] INTEGER DEFAULT 20,
         trailerField       [3] INTEGER DEFAULT 1  
}
Example
ASN.1 (BASE64):MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIDoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCA6IDAgFA
SEQUENCE (2 elem)
  OBJECT IDENTIFIER 1.2.840.113549.1.1.10 rsaPSS (PKCS #1)
  SEQUENCE (3 elem)
    [0] (1 elem)
      SEQUENCE (1 elem)
        OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.3 sha-512 (NIST Algorithm)
    [1] (1 elem)
      SEQUENCE (2 elem)
        OBJECT IDENTIFIER 1.2.840.113549.1.1.8 pkcs1-MGF (PKCS #1)
        SEQUENCE (1 elem)
          OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.3 sha-512 (NIST Algorithm)
    [2] (1 elem)
      INTEGER 64

Signature

它的结构和普通的 RSA 签名结构相同。

Example
ASN.1 (BASE64): A4ICAQBtN9GtaVt2XuYNpXNsTXA8m0VDXAgnurc8wWC2dnuIjOTJsE421Cn5i6ycLByzjecws3DamUL_b7m0xCfgYXj-J_Cktob4UmLMXqskAp_jQsKLp4b7B8PR_HRfslrEjfJbTBd932DUXSOWWJztqAhnKkW-9TJytpZFTl8kmGDC4tD-vtDaLQr5S7DNLbh-dGobg2ZP9QPnVXAE8C1geC1bx95T-hQAwozCe0atpYBsyetAQBP1bgIthZktVxTiTlx8VLBPWrsDrZYNJFISOdqIa0OiqCbJQdGXv79ooTI7tsGPvOVc-XCgLfK2UWXLyYPCDewBTsKA75adv3oxewl7iAH-ga2nCv4VbFTFVWnnn-BcLVwa7SJWT0KDI9-vWVQZz6dG-c8ImHlQY5EMmYwV0zcBEC2UHPHzTePRkVSVfxRo53eV0erps_hgYylz3LqTylV9qqFObb4jq_dMWB2EwKN5hSfvR63lVtlEZfxkif8DdiLJPUSZQ8Fak6aPDaET77rTH0clJMP8tve4hnUbM5j3zIzUFfbujYb_uws13ERyrESvyzTdRfI7TJBaO2AlC2COVCvbLWhPxfiCntOHgXaOA-2yCIG_s0O0YYE70HVrTbuHKdTqcfsiQx2P-5PMl7V-QOV3FrmkC5-L3Me5UrPWLMGOPffJDJYj7Vn6QA
BIT STRING (4096 bit) 0110110100110111110100011010101111011100…

Example Certificate

-----BEGIN CERTIFICATE-----
MIIHvjCCBXagAwIBAgIDD+R2MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIDoRowGAYJKoZIhvcN
AQEIMAsGCWCGSAFlAwQCA6IDAgFAMF4xCzAJBgNVBAYTAkRFMRUwEwYDVQQKEwxELVRydXN0IEdtYkgx
HzAdBgNVBAMTFkQtVFJVU1QgUm9vdCBDQSAzIDIwMTYxFzAVBgNVBGETDk5UUkRFLUhSQjc0MzQ2MB4X
DTE2MTAyNjA4MzYzOFoXDTMxMTAyNjA4MzY1MFowWzELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1
c3QgR21iSDEcMBoGA1UEAxMTRC1UUlVTVCBDQSAzLTEgMjAxNjEXMBUGA1UEYRMOTlRSREUtSFJCNzQz
NDYwggIgMAsGCSqGSIb3DQEBCgOCAg8AMIICCgKCAgEA0Qf6buWosCBXDA9QBiJjHLYSAYgKOatoXaJM
uclKoa1vNueQEKupz5Cw1u5oiyQIlgflJAyUHGNPv4IkpK01QfUFaNYKJswZ+nb3DK0aalbwghzZOBmY
Jn1qUNVD/G8ZJ4EcFrcHQp78Cuu4UpImNSjeA8Deg3X9i0NDyd0DR/jUjU9Ufwypf+NbklUH7YYfzdgU
onKgaPkVr99tjK7lnmUE0nQWa/FHQLFmx40txQbpFst/W6sLw3Dxk9VniZOeZO5/nY6hxP3wPr/H12nC
WuHfbQBl0H3ImqQFxvSdHGWaCOwousH+sywrlFaUv3Rtohq9ZVrAaFw3MAOXI9VpZBRh0gXx/tAtGnaz
QWBbShTGqgXAV8Gb/bHpIZiHA6iip87Sh+cHMUVYbdpowc7svirH5AvsY+5z/kbcmZNS796hvFPf0svJ
p+CUW8+H8atsCp5WKS7bzCE/bWjhlIUXjDlX8Czac2N9brUaJ/elyhL+iSq0z/Lrx/iH4SlkmZy5bdxG
d9vdYaTTHineTVVydtr/gwwrXpE92vKntLYQ2BDLLU6JKCzCRPJntdLCdr8lDY9hDMF+EMaw9EIYmNqd
Rl/UEldzoJQSf1oIGxNCb+K2tFKl9iL+9f6N5k9mblbF9j0uKkyLUHZJnRhWoaOEyRR/Uyy+62cvCfcn
CpjofsMCAwEAAaOCAigwggIkMB8GA1UdIwQYMBaAFNzAEr2IPWMTjDSr286LMsQRTl3nMIGJBggrBgEF
BQcBAQR9MHswMgYIKwYBBQUHMAGGJmh0dHA6Ly9yb290LWNhLTMtMjAxNi5vY3NwLmQtdHJ1c3QubmV0
MEUGCCsGAQUFBzAChjlodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NnaS1iaW4vRC1UUlVTVF9Sb290X0NB
XzNfMjAxNi5jcnQwcQYDVR0gBGowaDAJBgcEAIvsQAECMFsGCysGAQQBpTQCgRYBMEwwSgYIKwYBBQUH
AgEWPmh0dHA6Ly93d3cuZC10cnVzdC5uZXQvaW50ZXJuZXQvZmlsZXMvRC1UUlVTVF9Sb290X1BLSV9D
UFMucGRmMIG+BgNVHR8EgbYwgbMwdKByoHCGbmxkYXA6Ly9kaXJlY3RvcnkuZC10cnVzdC5uZXQvQ049
RC1UUlVTVCUyMFJvb3QlMjBDQSUyMDMlMjAyMDE2LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZp
Y2F0ZXJldm9jYXRpb25saXN0MDugOaA3hjVodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0
X3Jvb3RfY2FfM18yMDE2LmNybDAdBgNVHQ4EFgQU++3frUvwJbXSet2fmh0vbQlQIccwDgYDVR0PAQH/
BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgOhGjAY
BgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIDogMCAUADggIBAG030a1pW3Ze5g2lc2xNcDybRUNcCCe6tzzB
YLZ2e4iM5MmwTjbUKfmLrJwsHLON5zCzcNqZQv9vubTEJ+BheP4n8KS2hvhSYsxeqyQCn+NCwounhvsH
w9H8dF+yWsSN8ltMF33fYNRdI5ZYnO2oCGcqRb71MnK2lkVOXySYYMLi0P6+0NotCvlLsM0tuH50ahuD
Zk/1A+dVcATwLWB4LVvH3lP6FADCjMJ7Rq2lgGzJ60BAE/VuAi2FmS1XFOJOXHxUsE9auwOtlg0kUhI5
2ohrQ6KoJslB0Ze/v2ihMju2wY+85Vz5cKAt8rZRZcvJg8IN7AFOwoDvlp2/ejF7CXuIAf6BracK/hVs
VMVVaeef4FwtXBrtIlZPQoMj369ZVBnPp0b5zwiYeVBjkQyZjBXTNwEQLZQc8fNN49GRVJV/FGjnd5XR
6umz+GBjKXPcupPKVX2qoU5tviOr90xYHYTAo3mFJ+9HreVW2URl/GSJ/wN2Isk9RJlDwVqTpo8NoRPv
utMfRyUkw/y297iGdRszmPfMjNQV9u6Nhv+7CzXcRHKsRK/LNN1F8jtMkFo7YCULYI5UK9staE/F+IKe
04eBdo4D7bIIgb+zQ7RhgTvQdWtNu4cp1Opx+yJDHY/7k8yXtX5A5XcWuaQLn4vcx7lSs9YswY4998kM
liPtWfpA
-----END CERTIFICATE-----

ref: https://datatracker.ietf.org/doc/html/rfc4055#section-3.1

DSA


Algorithm Identifier

AlgorithmIdentifier  ::=  SEQUENCE  {
    algorithm   OBJECT IDENTIFIER
}

省略掉 parameters 字段

常见算法有: 1.2.840.10040.4.3 dsaWithSha1

Example
ASN.1 (BASE64): MAkGByqGSM44BAM
SEQUENCE
    algorithm OBJECT IDENTIFIER  1.2.840.10040.4.3  dsaWithSha1

Signature

Dss-Sig-Value  ::=  SEQUENCE  {
    r       INTEGER,
    s       INTEGER  
}
Example
ASN.1 (BASE64): AzAAMC0CFGgHwZmv-fAEoI1dhPH4ovDYY434AhUA1bz0wEtsVLpcHuh5M-A-pYTHQzA 
BIT STRING (1 elem)
  SEQUENCE (2 elem)
    INTEGER (159 bit) 593908010350368642838466899667916731408548335096
    INTEGER (160 bit) 1220228895115037960364580494953750520568947884848

Example Certificate

-----BEGIN CERTIFICATE-----
MIICeDCCAjegAwIBAgIBGDAJBgcqhkjOOAQDMCgxJjAkBgNVBAMTHW51bml0Q3Jl
YXRlQ2VydGlmaWNhdGVEU0FUZXN0MB4XDTE0MDIxOTA0MDYxOVoXDTE1MDIxOTA0
MDYxOVowHTEbMBkGA1UEAxMSbnVuaXRJbXBvcnRDU1JUZXN0MIIBtzCCASwGByqG
SM44BAEwggEfAoGBANQZrSvQpdy6Fn6N+WmzHo0rQI3FTj7fAbOFgOyZFm8+NHl1
7LS4RrVAqfjPiQhfk2pVg0UR/vhL+JdI4m3KccLUBgclRbAIBqA2RaudPsNJQWS4
XgZHxWjhknjij/dRaSX7B+a/S5O8mTvSr1KOYO9O3aUKAFlAJQH2PJz/FuRpAhUA
quGVd4ztfjTyMMc/WWi8nGgxTAMCgYEA0kbLvIJ6CzdZX11pbChlMHi1KgBXk2Pm
l7R/SnXt2CU9R4yy3/MGG3GbeD7wftlJJUF4fNdaLlhEOFRiNzllWI2HEGQgAc3u
tlnsH3zBpGqf90y5BuelGjtrh112vt6WJRQ3nXzcK7gHpU7dWXVzg2kddLUqLyxw
jtLZqsxsIHoDgYQAAoGAAQIKV6mfDIGmyWmlsrpQT6DFVsIg9Ei2Xvy92fW8ByXu
qu4D+Dqe9yd4rNKDlb4aS57RRU2eyjljgULFLxsSGvVkt+eS3v561NzRktT10C0F
JHDuyhLGTFcvBd558T8G4EhUj026mzC+y9K4RoGNa71Uc+nwmOHuuWi3iSH/TEEw
CQYHKoZIzjgEAwMwADAtAhRoB8GZr/nwBKCNXYTx+KLw2GON+AIVANW89MBLbFS6
XB7oeTPgPqWEx0Mw
-----END CERTIFICATE-----

ref: https://datatracker.ietf.org/doc/html/rfc3279#section-2.2.2


ECDSA


Algorithm Identifier

AlgorithmIdentifier  ::=  SEQUENCE  {
    algorithm   OBJECT IDENTIFIER
}

省略掉 parameters 字段

常见算法有:

  • 1.2.840.10040.4.1 ecdsaWithSha1
  • 1.2.840.10045.4.3.3 ecdsaWithSHA384
Example
ASN.1 (BASE64): MAoGCCqGSM49BAMD
SEQUENCE
    algorithm OBJECT IDENTIFIER 1.2.840.10045.4.3.3 ecdsaWithSHA384

Signature

 Ecdsa-Sig-Value  ::=  SEQUENCE  {
           r     INTEGER,
           s     INTEGER 
 }
Example
ASN.1 (BASE64): 
A2cAMGQCMCaTuLznCDlujR0XoRtMHMQriKsU_WoipGZEXz47DRQYuLA3E5giRdP7hjazg2Fw9wIwM87d54YtOQz9KtQMlDfoB0sRBRmm_Gq_R5XLNUV9qzo5ADn9JQ7L9lo9nie3-4DS
BIT STRING (1 elem)
  SEQUENCE (2 elem)
    INTEGER (382 bit) 59375495140776878538713805206…
    INTEGER (382 bit) 797399231549498092203024

ref: https://datatracker.ietf.org/doc/html/rfc3279#section-2.2.3


Example Certificate

-----BEGIN CERTIFICATE-----
MIIDfDCCAwOgAwIBAgISAxV46GHLPlnK3aeKb0JPkFVeMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
MTAeFw0yNDAzMDEwMjA3MTRaFw0yNDA1MzAwMjA3MTNaMBMxETAPBgNVBAMTCHYy
ZXguY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4Tdl0pOYn5Fj6WaCyY6K
knnTVzdYzvmAGxmDBkpNx8Pwui7IRhRxgGZQldEJIzCgTutyoX2QnvUQnIZmJSme
F6OCAhYwggISMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUm1GG2jMNQHpxVU+PgoPh
Wj4CKekwHwYDVR0jBBgwFoAUWvPtK/w2wjd5uVIw6lRvz1XLLqwwVQYIKwYBBQUH
AQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vZTEuby5sZW5jci5vcmcwIgYIKwYB
BQUHMAKGFmh0dHA6Ly9lMS5pLmxlbmNyLm9yZy8wHwYDVR0RBBgwFoIKKi52MmV4
LmNvbYIIdjJleC5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwggEEBgorBgEEAdZ5
AgQCBIH1BIHyAPAAdgBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+rOdiEcwAA
AY33+u+fAAAEAwBHMEUCIQCifYj7QyF6ZiBnri4m3h1AQWlAtPX8JJYg7ycJsw/c
zwIgS1LyEPnXJuOivQZJbRfCu41tzU12cuK9CLJ8r7ChjQkAdgA7U3d1Pi25gE6L
MFsG/kA7Z9hPw/THvQANLXJv4frUFwAAAY33+u+nAAAEAwBHMEUCIGfBVi40iTBm
5Z7DfPOTr9hH3URI+UNx2OxAR/cYApsCAiEA6v7j2CEnODKVJSbrK29M9HEdG64E
UAKuO5qhUYWtKjgwCgYIKoZIzj0EAwMDZwAwZAIwJpO4vOcIOW6NHRehG0wcxCuI
qxT9aiKkZkRfPjsNFBi4sDcTmCJF0/uGNrODYXD3AjAzzt3nhi05DP0q1AyUN+gH
SxEFGab8ar9Hlcs1RX2rOjkAOf0lDsv2Wj2eJ7f7gNI=
-----END CERTIFICATE-----

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VFSSoft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值