Cấp lại CA gốc tự ký mà không làm mất hiệu lực chứng chỉ được ký bởi nó


11

Tôi đã tạo một Cơ quan cấp chứng chỉ gốc tự ký cho một vài dịch vụ nội bộ trong công ty của chúng tôi do tôi tự cấu hình (chủ yếu phục vụ qua HTTPS). Sau đó, tôi đã tạo chứng chỉ cho các dịch vụ đó, đã ký với CA.

Bây giờ tôi muốn thêm tiện ích mở rộng x509 (điểm phân phối CRL) vào CA gốc mà không làm mất hiệu lực chứng chỉ máy chủ hiện có được cấp từ CA này. Điều này có thể không?

Cảm giác ruột của tôi là "có" bởi vì theo tôi hiểu, việc truy cập vào khóa riêng tương ứng là cần thiết đủ cho "toàn quyền" đối với nhận dạng chứng chỉ. Đó là, trừ khi có một số loại nonce được kết hợp cùng với khóa chung vào chứng chỉ khi nó được tạo (có khả năng).

Tôi vẫn còn khá mới đối với việc quản lý chứng chỉ SSL, nhưng tôi (nghĩ rằng tôi) hiểu những điều cơ bản của chuỗi tin cậy tiêu chuẩn. Tôi cũng thoải mái với việc sử dụng cơ bản các loại tiền điện tử PKI khác: Tôi quản lý các khóa SSH và sử dụng GPG để ký và mã hóa. Tôi đã học Khoa học Máy tính, mặc dù tôi chỉ là một người học tự học về mật mã.

Tôi chưa bao giờ thực hiện CSR cho IIRC ban đầu (tôi nghĩ đó là đầu ra trực tiếp của openssl req -new -x509). Dĩ nhiên, tôi vẫn có khóa riêng của CA gốc và sử dụng nó, tôi có thể "đảo ngược" chứng chỉ gốc thành Yêu cầu ký chứng chỉ: openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key

Tôi đã hy vọng điều này sẽ "trích xuất" một cách hiệu quả các nonce đã đề cập ở trên và cho phép tôi tạo lại chứng chỉ nhưng lần này với một crlDistributionPointstrường và do đó, tất cả các chứng chỉ đã được ký với CA gốc vẫn sẽ xác nhận đối với CA mới này, ngoại trừ khách hàng sẽ truy xuất tệp CRL (hiện đang trống) của tôi từ URL HTTP được chỉ định trong trường.

Vì vậy, tôi đã thực hiện một tập tin cấu hình mở rộng ext.conf:

[ cert_ext ] 
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl

Và tôi đã tạo phiên bản mới của CA gốc từ CSR:

openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem

Bây giờ khi tôi xem chứng chỉ với openssl x509 -text -in MyNewCA.pem | less

Tôi có thể thấy phần mở rộng CRL:

X509v3 extensions:
    X509v3 Subject Key Identifier: 
        82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
    X509v3 CRL Distribution Points: 

        Full Name:
          URI:http://security.mycompany.co.za/root.crl`

Nhưng than ôi! Chứng chỉ đã ký trước đây của tôi không còn hiệu lực đối với chứng chỉ này:

openssl verify -verbose -CAfile MyCA.pem git.pem 
git.pem: OK

openssl verify -verbose -CAfile MyNewCA.pem git.pem 
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate

Chủ yếu là tôi đang tìm kiếm cái nhìn sâu sắc hơn về cách chứng chỉ hoạt động và tại sao. Nhưng tôi cũng hoan nghênh một giải pháp cho vấn đề dẫn đến vấn đề này, vì vậy đây cũng là một số thông tin cơ bản.

Làm thế nào tôi gặp rắc rối này: HTTPS để các dịch vụ nội bộ hoạt động tốt khi CA của tôi được cài đặt qua Explorer RMB → Cài đặt GUI chứng chỉ trên Windows hoặc /usr/local/share/ca-certificatestiếp theo là update-ca-certificatestrên Debian và Ubuntu. Nhưng gần đây tôi đã gặp phải một ngoại lệ: Git trên Windows, cụ thể là nếu được cài đặt để sử dụng Windows Secure Channel làm SSL back-end. Theo mặc định, rõ ràng là phải có trường CRL trong chứng chỉ SSL.

Vì vậy, tôi đoán đây thực sự là sự cố Windows Secure Channel vì thông báo lỗi tôi tiếp tục chạy dường như hoàn toàn do Microsoft cung cấp: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

Nếu tôi cài đặt Git với OpenSSL và ghép thủ công CA của mình vào tệp được chỉ ra bởi git.http.sslcainfo thì nó hoạt động, nhưng tôi sợ người dùng của tôi sẽ có xu hướng không xác minh nhận dạng SSL nếu họ cảm thấy quá trình này nỗ lực hơn nhấp qua GUI cài đặt chứng chỉ Windows "dễ dàng".


1
Chỉ có khóa công khai và Chủ đề tạo chứng chỉ duy nhất. Do đó, nếu bạn không thay đổi, bạn sẽ có thể ký lại chứng chỉ của mình trong khi thay đổi tất cả các trường và tiện ích mở rộng khác cho nội dung trái tim của bạn.
garethTheRed

@garethTheRed ah, điều đó có ý nghĩa. Tôi không chắc làm thế nào để làm điều này; bạn có thể xây dựng hoặc gửi một câu trả lời với nhiều chi tiết hơn? Tôi hy vọng rằng -x509toreqsẽ phục hồi tất cả thông tin duy nhất từ ​​CA gốc, nhưng nó không hoặc có gì sai với quy trình của tôi từ đó.
AngerySysadmin

1
req -new -x509x509 -req -signkeycả hai mặc định nối tiếp của chứng chỉ tự ký thành một số ngẫu nhiên (mặc dù điều này có thể bị ghi đè) một cách hiệu quả. Nếu chứng chỉ con của bạn (hoặc bất kỳ trong số chúng) có chứa AuthorKeyIdentifier sử dụng tùy chọn 'nhà phát hành + nối tiếp' (thay vì hoặc ngoài tùy chọn 'keyid'), đó sẽ là trường hợp nếu bạn sử dụng cavới tệp cấu hình mặc định ngược dòng, bạn cần tạo root mới với serial nối tiếp với root cũ; sử dụng -set_serial. ...
dave_thndry_085

... Nhưng một số sw có thể không vui nếu bạn cố gắng nhập một chứng chỉ mới có cùng tên và sê-ri như một chứng chỉ hiện có; bạn có thể cần phải dọn sạch cái cũ trước.
dave_thndry_085

1
Gần-cross-dupe security.stackexchange.com/questions/17331/... PS: Tôi nghĩ rằng nó có thể để có được Windows tự cache CRL cho một CA trong trường hợp này thiếu CRLDP có thể không vấn đề, nhưng làm thế nào bất tiện đó sẽ là Tôi không biết.
dave_thndry_085

Câu trả lời:


5

Hai chứng chỉ được coi là giống như Tên chủ đềKhóa công khai của chứng chỉ khớp với nhau.

Do đó, tất cả những gì bạn cần làm là sử dụng lại các khóa và đảm bảo rằng Tên chủ đề trong chứng chỉ mới giống với tên cũ. Sau đó, bạn có thể thay đổi bất kỳ trường nào và / hoặc tiện ích mở rộng khác và chứng chỉ kết quả sẽ được coi là giống nhau.

Ví dụ: tạo tệp cấu hình OpenSSL của bạn:

[ req ]

prompt             = no
string_mask        = default
distinguished_name = x509_distinguished_name
x509_extensions     = x509_ext

[ x509_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.
# Adjust for your setup:

countryName = za
organizationName = My Company
organizationalUnitName = Security
commonName = My Root CA

[ x509_ext ]

basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
crlDistributionPoints = URI:http://security.mycompany.co.za/root.crl

và lưu nó như ví dụ rootca.cnf. Đảm bảo rằng các thành phần của [req_distinguished_name]giống hệt với các thành phần trong chứng chỉ Root CA gốc của bạn (đây là phần Tên chủ đề giống hệt nhau).

Tiếp theo, chạy:

openssl req -new -x509 -key rootca.key -out MyNewCA.pem -config rootca.cnf

trong đó rootca.keykhóa riêng được sử dụng trong chứng chỉ gốc (đây là phần Khóa công khai / riêng tư giống hệt nhau).

Điều này tạo ra MyNewCA.pem, mà bạn có thể kiểm tra với:

$ openssl x509 -noout -text -in MyNewCA.pem

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 17564687072266118846 (0xf3c24dd49d5166be)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=za, O=My Company, OU=Security, CN=My Root CA
    Validity
        Not Before: Jul 15 05:05:54 2017 GMT
        Not After : Aug 14 05:05:54 2017 GMT
    Subject: C=za, O=My Company, OU=Security, CN=My Root CA
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
            Modulus:
                00:c8:3d:32:8a:56:31:f6:27:1a:ce:9e:b2:1d:fb:
                ce:9f:ce:5b:42:25:aa:fe:8b:f4:34:32:ac:b3:02:
                50:71:f8:c3:43:0c:c7:2c:9f:fe:48:1b:c6:c0:e7:
                d6:44:a9:e7:d7:a0:7e:58:f4:b6:38:61:7e:d0:af:
                0f:56:21:e7:49:7a:66:13:f5:7a:fe:3d:ab:65:f8:
                01:eb:52:a7:3b:ae:a0:cf:50:57:b9:e0:09:0b:1f:
                90:14:fb:18:56:1d:57:99:a9:76:a2:63:d1:c2:d3:
                a3:f4:3a:ff:91:0d:ee:8d:44:13:58:00:09:93:da:
                e8:6a:fd:64:5f:c3:42:8e:2a:49:6e:0d:73:b7:b9:
                d4:6c:c6:ce:30:c5:82:24:a5:00:37:17:a0:1d:f1:
                c9:e9:e3:18:48:22:4f:33:96:a7:3c:a9:31:f1:3f:
                14:40:6a:74:e8:78:82:45:04:d4:4b:56:0b:cd:be:
                48:8d:03:fb:39:70:0b:91:99:70:06:bd:5e:8b:f2:
                d1:f4:6f:fc:ce:e7:f8:3c:0a:20:ea:35:b8:5f:2f:
                ee:8d:ff:d3:93:85:6b:fb:71:db:1b:e6:e9:1d:a7:
                f8:e4:ae:f4:71:fe:35:a7:89:24:af:69:a4:34:3b:
                14:66:05:02:5e:2a:1d:ac:e0:d2:48:6c:13:4e:75:
                58:93
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Subject Key Identifier: 
            3B:45:93:3A:2A:BC:39:29:36:13:6C:BD:B6:B4:31:C7:E7:BB:32:73
        X509v3 CRL Distribution Points: 

            Full Name:
              URI:http://security.mycompany.co.za/root.crl

Signature Algorithm: sha256WithRSAEncryption
     4d:96:d4:03:4f:e3:7c:26:be:59:f8:23:87:60:f7:4c:d3:a1:
     1c:77:a1:14:e3:e7:da:c8:2a:a3:1b:06:2a:4d:55:1c:83:26:
     73:46:0d:8a:e4:b7:d1:1e:38:cc:78:90:00:01:b3:8e:f9:3c:
     62:be:04:09:90:4e:22:87:b1:aa:bd:f9:73:bd:a7:76:ad:d5:
     ae:2d:7a:1c:1e:1a:67:c8:57:4c:f9:6d:8b:62:d6:e5:ea:e0:
     40:5c:12:28:7e:ea:f0:0c:d6:cd:f4:1d:d5:56:09:ad:43:b4:
     eb:8c:68:ce:56:a2:a8:ae:a4:d5:35:bb:58:b8:ed:82:82:b5:
     ef:cb:e2:6d:76:61:ed:ee:a5:1f:68:95:07:ed:5b:f0:65:92:
     d2:dc:1d:c6:fa:7f:e0:c9:38:c2:c6:6f:03:38:e7:3a:b0:24:
     06:e0:bc:07:dd:e7:a0:dc:74:09:e5:37:7b:66:e1:6f:47:4c:
     71:ff:02:48:7f:d4:4f:ce:cb:91:e9:ee:cd:b6:f1:0a:03:19:
     3e:19:05:7d:8f:48:e7:f1:cc:07:37:3d:91:3c:6f:54:71:3c:
     a2:6c:55:c3:03:c1:7f:eb:9e:70:f1:8f:a1:fb:62:33:8b:86:
     2c:79:bc:76:e2:01:9a:68:df:af:40:a1:b2:9c:f6:a1:e1:6e:
     2a:dd:1a:d6

Sử dụng chứng chỉ mới này thay cho bản gốc.

Bạn có thể thay đổi các trường và tiện ích mở rộng khác, chẳng hạn như thời hạn hiệu lực của chứng chỉ, nhưng hãy nhớ rằng bạn không thực sự có bất kỳ ràng buộc nào (ngoài basicConstraints = critical,CA:true) trên chứng chỉ Root CA.


Sau khi xem xét thêm, vấn đề của bạn có thể chỉ đơn giản là thực tế là chứng chỉ Root CA thay thế của bạn không có basicConstraintvà có thể là các keyUsagephần mở rộng. Có thể đáng để thử thêm hai tiện ích mở rộng đó vào ext.conflần đầu tiên của bạn và kiểm tra chứng chỉ Root CA mới bằng cách sử dụng -x509toreqphương pháp bạn đã đăng.


Cảm ơn câu trả lời toàn diện, nó thực sự đã giúp tôi hiểu mọi thứ tốt hơn. Với ý kiến ​​này và @ dave_thndry_085, tôi đã quản lý để tạo lại CA của mình theo cách không làm mất hiệu lực của trẻ em. Có một vài điều sai với nỗ lực ban đầu của tôi (tôi có lẽ nên đăng câu trả lời với nhiều chi tiết hơn?) Cũng cảm ơn vì điểm rõ ràng nhưng quan trọng đó là "Tên chủ đề" là một trường bao gồm các trường cụ thể đó. Tôi bằng cách nào đó nghi ngờ bất cứ ai khác sẽ đăng một câu trả lời, vì vậy tôi chấp nhận câu trả lời này.
AngerySysadmin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.