Tôi đã cố tạo CSR bằng gói "crypto/x509" và không tìm cách thêm trường "emailAddress" vào Chủ đề của nó.Tạo yêu cầu ký chứng chỉ (CSR) với Go
Theo tài liệu, cấu trúc CertificateRequest có trường "EmailAddresses [] string" nhưng được tuần tự hóa thành tiện ích mở rộng SAN. Đây là một mã kiểm tra i sử dụng: http://play.golang.org/p/OtObaTyuTM
Ngoài ra tôi đã tạo ra một CSR sử dụng "openssl req" chương trình và so sánh kết quả:
% openssl req -in openssl.csr -noout -text
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=AU, ST=Some-State, L=MyCity, O=Company Ltd, OU=IT, CN=domain.com/[email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (512 bit)
Modulus:
00:a3:05:e3:37:63:f9:8b:d0:37:46:2d:a8:d9:26:
4e:be:83:1d:b9:30:88:2b:80:4b:53:cc:7c:01:86:
b0:9b:1d:3b:0a:05:c4:56:47:4e:5d:90:f9:5a:29:
8b:9a:7f:fa:4b:5e:e4:5d:dd:c6:8b:87:33:c4:b4:
fa:6b:b4:67:bd
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha1WithRSAEncryption
0b:24:6e:0a:f9:bf:23:d7:41:5f:96:da:78:d1:99:18:fb:d6:
71:7e:79:f0:02:e9:8a:50:a9:00:32:df:26:14:2f:f4:3e:c4:
22:c9:5c:4e:79:c1:c2:22:1b:2a:da:79:6f:51:ba:8a:12:63:
27:02:4a:b3:22:97:59:f7:6e:d6
===============================================================
% openssl req -in golang.csr -noout -text
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=AU, O=Company Ltd, OU=IT, L=MyCity, ST=Some-State, CN=domain.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (512 bit)
Modulus:
00:ac:b6:51:5b:53:44:44:20:91:da:01:45:72:49:
95:83:78:74:7c:05:f9:a7:77:88:02:3a:23:5f:04:
c3:69:45:b9:5a:bb:fd:e7:d3:24:5f:46:14:b8:7d:
30:ce:a0:c6:ea:e3:3b:ec:4c:75:24:cc:ce:60:1d:
e9:33:57:ae:21
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
email:[email protected]
Signature Algorithm: sha256WithRSAEncryption
a1:c1:b7:80:a0:f0:c3:b6:44:06:f4:ad:12:3a:67:19:fa:84:
34:22:2a:d9:56:d9:8b:c9:a4:d0:cf:8d:a1:36:87:fa:75:b7:
05:40:0a:15:1f:72:61:85:a8:09:bc:f4:13:e6:24:5e:2e:b7:
99:e3:93:53:4e:2d:d5:0c:22:fc
Để tâm trí của tôi, tôi nên xây dựng RawSubject trường bản thân mình với emainAddress oid nhưng Tôi không tìm thấy bất kỳ mẫu mã nào. UPD: Tôi đã tìm thấy giải pháp. Như tôi đã đề cập ở trên, trường RawSubject phải được chuẩn bị bằng tay:
subj := pkix.Name{
CommonName: cn,
Country: []string{c},
Organization: []string{o},
OrganizationalUnit: []string{ou},
Locality: []string{l},
Province: []string{s},
}
rawSubj := subj.ToRDNSequence()
rawSubj = appendRDNs(rawSubj, []string{e}, oidEmailAddress)
asn1Subj, err := asn1.Marshal(rawSubj)
template := x509.CertificateRequest{
RawSubject: asn1Subj,
SignatureAlgorithm: x509.SHA1WithRSA,
}
nơi:
- var oidEmailAddress = asn1.ObjectIdentifier {1, 2, 840, 113.549, 1, 9, 1}
- appendRDNs() được định nghĩa trong crypto/x509/pkix (vì tên của nó không bắt đầu bằng chữ cái hoa, nó không được xuất theo mặc định. Bạn chỉ có thể xác định lại nó làm hàm của riêng bạn với bản sao dán &).
Cảm ơn bạn, pram! – mephist
Tôi đã kiểm tra giải pháp của bạn. Theo nguồn mở openssl, "CN" và "emailAddress" lĩnh vực có oid riêng của họ ('2.5.4.3' và '1.2.840.113549.1.9.1' tương ứng), do đó, chỉ cần thêm email vào CommonName là sai cách. – mephist