php-Editor Strawberry zeigt Ihnen, wie Sie DirName und Seriennummer zur X509v3-Autorisierungsschlüssel-ID hinzufügen. Bei der Netzwerkkommunikation ist eine Autorisierungsschlüssel-ID (X509v3) ein digitales Zertifikat, das zur Überprüfung der Identität der kommunizierenden Partei verwendet wird. DirName bezieht sich auf den Namen des Zertifikatsinhabers, während die Seriennummer die Nummer ist, die zur eindeutigen Identifizierung des Zertifikats verwendet wird. Durch das Hinzufügen von DirName und Seriennummer können die Lesbarkeit und Einzigartigkeit des Zertifikats erhöht sowie die Sicherheit und Zuverlässigkeit der Kommunikation verbessert werden. Als nächstes erklären wir im Detail, wie das geht.
Ich versuche, ein Client-Zertifikat mit OpenSSL und Go-Code zu generieren. Ich habe ein OpenSSL-Skript, das ein Zertifikat mit der erforderlichen Erweiterung generiert, und ich möchte mit Go-Code das gleiche Ergebnis erzielen.
Die von openssl verwendete Datei „options.ext“ enthält die folgenden Erweiterungen:
basicconstraints=ca:false authoritykeyidentifier=keyid,issuer subjectkeyidentifier=hash keyusage=digitalsignature extendedkeyusage=clientauth
Das OpenSSL-Skript, das ich derzeit habe, lautet wie folgt:
openssl req \ -newkey rsa:2048 \ -keyout cert.crt \ -out cert.csr \ -nodes \ -sha256 openssl x509 \ -req \ -ca ca.crt \ -cakey ca.key \ -in cert.csr \ -out cert.crt \ -days 365 \ -cacreateserial \ -extfile options.ext \ -sha256
Nachdem ich das Zertifikat generiert habe, kann ich seine Details mit dem folgenden Befehl anzeigen:
openssl x509 -in cert.crt -text -noout
Das generierte Zertifikat hat folgenden Aufbau:
certificate: data: version: 3 (0x2) serial number: xx:xx:xx:xx:xx:xx:xx:xx signature algorithm: sha256withrsaencryption issuer: cn=xxx validity not before: jan 1 00:00:00 2023 gmt not after : jan 1 00:00:00 2024 gmt subject: cn=xxx subject public key info: public key algorithm: rsaencryption rsa public-key: (2048 bit) modulus: ... exponent: 65537 (0x10001) x509v3 extensions: x509v3 basic constraints: ca:false x509v3 authority key identifier: dirname:cn=xxx serial:xx:xx:xx:xx:xx:xx:xx:xx x509v3 subject key identifier: ... x509v3 key usage: digital signature x509v3 extended key usage: tls web client authentication signature algorithm: sha256withrsaencryption
Es sollte so aussehen:
x509v3 authority key identifier: dirname:cn=xxx serial:xx:xx:xx:xx:xx:xx:xx:xx
In meinem Go-Code verwende ich das x509-Paket, um das Zertifikat zu generieren. Ich bin mir jedoch nicht sicher, wie ich die x509v3-Autorisierungsschlüssel-ID-Erweiterung einrichten soll. Hier ist der relevante Teil meines Go-Codes:
import ( "crypto/rand" "crypto/rsa" "crypto/sha1" "crypto/x509" "crypto/x509/pkix" "encoding/asn1" "os" "time" ) ... var cacertificate *x509.certificate var caprivatekey *rsa.privatekey var authoritykeyidentifiervalue []byte // how to write this? template := &x509.certificate{ subject: pkix.name{ commonname: "xxx", }, extraextensions: []pkix.extension{ { id: asn1.objectidentifier{2, 5, 29, 35}, value: authoritykeyidentifiervalue, }, }, keyusage: x509.keyusagedigitalsignature, extkeyusage: []x509.extkeyusage{x509.extkeyusageclientauth}, notbefore: time.now(), notafter: time.now().adddate(0, 0, 365), isca: false, basicconstraintsvalid: true, } privatekey, err := rsa.generatekey(rand.reader, 2048) if err != nil { // err } certificatebytes, err := x509.createcertificate(rand.reader, template, cacertificate, &privatekey.publickey, caprivatekey) if err != nil { // err } // out
Wie füge ich Verzeichnisnamen und Seriennummer zur x509v3-Autorisierungsschlüssel-ID hinzu?
Wenn ich das versuche:
var capublickeybytes []byte publickeyhash := (sha1.sum(capublickeybytes))[:] var dirname string authoritykeyidentifiervalue := []byte{0x30, len(publickeyhash)} authoritykeyidentifiervalue = append(authoritykeyidentifiervalue, publickeyhash...) authoritykeyidentifiervalue = append(authoritykeyidentifiervalue, 0x80, len(dirname)) authoritykeyidentifiervalue = append(authoritykeyidentifiervalue, []byte(dirname)...) ...
Das Ergebnis ist:
X509v3 Authority Key Identifier: 0....0...<....).!.r[..F.....".hCN=xxx.....$...D
authoritykeyidentifiervalue
可以使用 asn1.marshal 生成。下面的演示根据 rfc 5280authkeyid > und verwenden Sie diese Struktur, um den Wert zu generieren:
package main import ( "crypto/x509" "crypto/x509/pkix" "encoding/asn1" "encoding/hex" "encoding/pem" "fmt" "math/big" ) // rfc 5280, a.2. implicitly tagged module, 1988 syntax // // authoritykeyidentifier ::= sequence { // keyidentifier [0] keyidentifier optional, // authoritycertissuer [1] generalnames optional, // authoritycertserialnumber [2] certificateserialnumber optional } // -- authoritycertissuer and authoritycertserialnumber must both // -- be present or both be absent type authkeyid struct { keyidentifier []byte `asn1:"optional,tag:0"` authoritycertissuer generalnames `asn1:"optional,tag:1"` authoritycertserialnumber *big.int `asn1:"optional,tag:2"` } // rfc 5280, a.2. implicitly tagged module, 1988 syntax // // generalnames ::= sequence size (1..max) of generalname // // generalname ::= choice { // othername [0] anothername, // rfc822name [1] ia5string, // dnsname [2] ia5string, // x400address [3] oraddress, // directoryname [4] name, // edipartyname [5] edipartyname, // uniformresourceidentifier [6] ia5string, // ipaddress [7] octet string, // registeredid [8] object identifier } type generalnames struct { name []pkix.rdnsequence `asn1:"tag:4"` } func gen(issuer *x509.certificate) ([]byte, error) { return asn1.marshal(authkeyid{ keyidentifier: issuer.subjectkeyid, authoritycertissuer: generalnames{name: []pkix.rdnsequence{issuer.issuer.tordnsequence()}}, authoritycertserialnumber: issuer.serialnumber, }) } func main() { cacert := `-----begin certificate----- miibotccauegawibagiqgocjdjn1y6rgwebxw8v8mdakbggqhkjopqqdajammq8w dqydvqqkewznesbpcmcxezarbgnvbamtck15ifjvb3qgq0ewhhcnmjmwnte2mtqy ntuwwhcnmjmwnte3mtuyntuwwjammq8wdqydvqqkewznesbpcmcxezarbgnvbamt ck15ifjvb3qgq0ewwtatbgcqhkjopqibbggqhkjopqmbbwncaarzqz2ka7fi6w9/ 32sjhtajrke+vqyx7hfnmtx1inpbajnfvonf2silh5nqms50jpnvgivehtbfl0a0 dcurufhno1cwvtaobgnvhq8baf8ebamcaqqwewydvr0lbawwcgyikwybbquhawew dwydvr0taqh/bauwaweb/zadbgnvhq4efgqu5y48dj96lqwvh3s/anj/6sgy/j4w cgyikozizj0eawidsaawrqihanqdh6sgz014wvfdh0zhbeghdb2tqxzujxa7ymo3 80unaiapzp4wlzqlb+j4fipnep+txru01jgfaksml2yhv3mewg== -----end certificate-----` b, _ := pem.decode([]byte(cacert)) if b == nil { panic("couldn't decode test certificate") } issuer, err := x509.parsecertificate(b.bytes) if err != nil { panic(err) } authoritykeyidentifiervalue, err := gen(issuer) if err != nil { panic(err) } fmt.println(hex.encodetostring(authoritykeyidentifiervalue)) }
Der hexadezimale Kodierungswert ist:
30548014e58e3c0c9f7a2d05958774bf68d27fe921b2fe3ea12aa4283026310f300d060355040a13064d79204f7267311330110603550403130a4d7920526f6f7420434182101a80a30c937563aac65846d75bc57c30
Hex-Strings können mit einem Javascript-Decoder wie asn.1 :
erstellt werdenDie folgende C#-Demo liefert das gleiche Ergebnis:
using system.security.cryptography.x509certificates; using system.text; internal class program { private static void main(string[] args) { var certbytes = encoding.ascii.getbytes(@"-----begin certificate----- miibotccauegawibagiqgocjdjn1y6rgwebxw8v8mdakbggqhkjopqqdajammq8w dqydvqqkewznesbpcmcxezarbgnvbamtck15ifjvb3qgq0ewhhcnmjmwnte2mtqy ntuwwhcnmjmwnte3mtuyntuwwjammq8wdqydvqqkewznesbpcmcxezarbgnvbamt ck15ifjvb3qgq0ewwtatbgcqhkjopqibbggqhkjopqmbbwncaarzqz2ka7fi6w9/ 32sjhtajrke+vqyx7hfnmtx1inpbajnfvonf2silh5nqms50jpnvgivehtbfl0a0 dcurufhno1cwvtaobgnvhq8baf8ebamcaqqwewydvr0lbawwcgyikwybbquhawew dwydvr0taqh/bauwaweb/zadbgnvhq4efgqu5y48dj96lqwvh3s/anj/6sgy/j4w cgyikozizj0eawidsaawrqihanqdh6sgz014wvfdh0zhbeghdb2tqxzujxa7ymo3 80unaiapzp4wlzqlb+j4fipnep+txru01jgfaksml2yhv3mewg== -----end certificate-----"); using var issuer = new x509certificate2(certbytes); var e = x509authoritykeyidentifierextension.createfromcertificate(issuer, true, true); console.writeline(bytearraytohex(e.rawdata)); } private static string bytearraytohex(byte[] bytes) { var builder = new stringbuilder(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { builder.append($"{bytes[i]:x2}"); } return builder.tostring(); } }
Update:
Dies ist eine aktualisierte Version von gen
, die die E-Mail-Adresse enthält:
func gen(issuer *x509.Certificate) ([]byte, error) { rdnSequence := issuer.Issuer.ToRDNSequence() if len(issuer.EmailAddresses) > 0 { oidEmail := asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1} emails := make([]pkix.AttributeTypeAndValue, len(issuer.EmailAddresses)) for i, value := range issuer.EmailAddresses { emails[i].Type = oidEmail emails[i].Value = value } rdnSequence = append(rdnSequence, emails) } return asn1.Marshal(authKeyId{ KeyIdentifier: issuer.SubjectKeyId, AuthorityCertIssuer: generalNames{Name: []pkix.RDNSequence{rdnSequence}}, AuthorityCertSerialNumber: issuer.SerialNumber, }) }
Bitte beachten Sie, dass oid veraltet ist (siehe http://oid-info.com/get/1.2.840.113549.1.9.1). .net enthält es auch nicht.
Das obige ist der detaillierte Inhalt vonSo fügen Sie DirName und Seriennummer zur X509v3-Autorisierungsschlüssel-ID hinzu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!