2014-09-25 23 views
5

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 &).

Trả lời

1

Chỉ cần đặt nó trong CommonName?

CommonName:   "domain.com/[email protected]", 

Subject: C = AU, O = Company Ltd, OU = IT, L = MyCity, ST = Một số-Nhà nước, CN=domain.com/[email protected]

+0

Cảm ơn bạn, pram! – mephist

+0

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

7

Tôi biết mephist đã trả lời câu hỏi của riêng mình, nhưng ông đã để lại một vài thứ để ghép lại với nhau. Vì vậy, vì lợi ích của sự hoàn chỉnh (và bởi vì tôi đã hạ cánh ở đây hai lần trong 2 năm qua ...) Đây là một ví dụ làm việc hoàn chỉnh: https://play.golang.org/p/YL_qfPe4Zz

package main 

import (
    "crypto/rand" 
    "crypto/rsa" 
    "crypto/x509" 
    "crypto/x509/pkix" 
    "encoding/asn1" 
    "encoding/pem" 
    "os" 
) 

var oidEmailAddress = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1} 

func main() { 
    keyBytes, _ := rsa.GenerateKey(rand.Reader, 1024) 

    emailAddress := "[email protected]" 
    subj := pkix.Name{ 
     CommonName:   "example.com", 
     Country:   []string{"AU"}, 
     Province:   []string{"Some-State"}, 
     Locality:   []string{"MyCity"}, 
     Organization:  []string{"Company Ltd"}, 
     OrganizationalUnit: []string{"IT"}, 
    } 
    rawSubj := subj.ToRDNSequence() 
    rawSubj = append(rawSubj, []pkix.AttributeTypeAndValue{ 
     {Type: oidEmailAddress, Value: emailAddress}, 
    }) 

    asn1Subj, _ := asn1.Marshal(rawSubj) 
    template := x509.CertificateRequest{ 
     RawSubject:   asn1Subj, 
     EmailAddresses:  []string{emailAddress}, 
     SignatureAlgorithm: x509.SHA256WithRSA, 
    } 

    csrBytes, _ := x509.CreateCertificateRequest(rand.Reader, &template, keyBytes) 
    pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE REQUEST", Bytes: csrBytes}) 

} 
Các vấn đề liên quan