Tạo chuỗi chứng chỉ đa cấp bằng OpenSSL

Khởi tạo hệ thống

rm -rf /etc/pki/CA/*.old
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
echo 02 > /etc/pki/CA/serial
rm -rf keys
mkdir keys

Tạo CA gốc và tự ký (Tên chung là RootCA)

[root@localhost CA]# openssl genrsa  -out keys/RootCA.key 2048

Tạo khóa RSA 2048 bit

................+++

......+++

e = 65537 (0x10001)

[root@localhost CA]# openssl req -new -x509 -days 3650 -key keys/RootCA.key -out keys/RootCA.crt

Bạn sẽ được yêu cầu nhập thông tin sẽ được đưa vào yêu cầu chứng chỉ.

Thông tin này gọi là Distinguished Name (DN).

Một số trường có thể để trống

Một số trường có giá trị mặc định,

Nếu nhập '.', trường sẽ được để trống.

-----

Tên nước (2 ký tự) [XX]:CN

Tỉnh/Thành phố (tên đầy đủ) []:BJ

Tên thành phố [Thành phố Mặc định]:BJ

Tên tổ chức [Công ty Mặc định Ltd]:BJ

Đơn vị tổ chức []:BJ

Tên chung []:benet.com

Địa chỉ email []:

Tạo CA cấp 2 (Tên chung là secondCA)

[root@localhost CA]#  openssl rsa -in keys/secondCA.key -out keys/secondCA.key
writing RSA key
[root@localhost CA]# openssl req -new -days 3650 -key keys/secondCA.key -out keys/secondCA.csr
Bạn sẽ được yêu cầu nhập thông tin sẽ được đưa vào yêu cầu chứng chỉ.
Thông tin này gọi là Distinguished Name (DN).
Một số trường có thể để trống
Một số trường có giá trị mặc định,
Nếu nhập '.', trường sẽ được để trống.
-----
Tên nước (2 ký tự) [XX]:CN
Tỉnh/Thành phố (tên đầy đủ) []:BJ
Tên thành phố [Thành phố Mặc định]:BJ
Tên tổ chức [Công ty Mặc định Ltd]:BJ
Đơn vị tổ chức []:BJ
Tên chung []:benet.com
Địa chỉ email []:

Nhập các thuộc tính bổ sung
Mật khẩu thách thức []:
Tên công ty tùy chọn []:
[root@localhost CA]# openssl ca -extensions v3_ca -in keys/secondCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/secondCA.crt -cert keys/RootCA.crt -keyfile keys/RootCA.key
Sử dụng cấu hình từ /etc/pki/tls/openssl.cnf
Kiểm tra yêu cầu khớp với chữ ký
Chữ ký hợp lệ
Chi tiết chứng chỉ:
        Số serial: 2 (0x2)
        Thời hạn
            Không Trước: 21/08 09:22:09 2020 GMT
            Không Sau : 19/08 09:22:09 2030 GMT
        Chủ thể:
            countryName               = CN
            stateOrProvinceName       = BJ
            organizationName          = BJ
            organizationalUnitName    = BJ
            commonName                = benet.com
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                C0:03:65:8D:DC:95:F2:E1:52:FE:04:65:EF:12:4E:69:8A:C5:F9:24
            X509v3 Authority Key Identifier: 
                keyid:EC:1F:44:CC:E3:28:64:F7:3F:5A:D5:2A:53:AF:A0:94:73:02:47:2B

            X509v3 Basic Constraints: 
                CA:TRUE
Chứng chỉ sẽ được xác nhận đến 19/08 09:22:09 2030 GMT (3650 ngày)
Ký chứng chỉ? [y/n]:y


1/1 yêu cầu chứng chỉ được xác nhận, cam kết? [y/n]y
Ghi cơ sở dữ liệu với 1 mục mới
Cơ sở dữ liệu đã cập nhật

Tạo CA cấp 3 (Tên chung là thirdCA)

[root@localhost CA]# openssl rsa -in keys/thirdCA.key -out keys/thirdCA.key
writing RSA key
[root@localhost CA]# openssl req -new -days 3650 -key keys/thirdCA.key -out keys/thirdCA.csr
Bạn sẽ được yêu cầu nhập thông tin sẽ được đưa vào yêu cầu chứng chỉ.
Thông tin này gọi là Distinguished Name (DN).
Một số trường có thể để trống
Một số trường có giá trị mặc định,
Nếu nhập '.', trường sẽ được để trống.
-----
Tên nước (2 ký tự) [XX]:CN
Tỉnh/Thành phố (tên đầy đủ) []:BJ
Tên thành phố [Thành phố Mặc định]:BJ
Tên tổ chức [Công ty Mặc định Ltd]:BJ
Đơn vị tổ chức []:BJ
Tên chung []:benet.com
Địa chỉ email []:

Nhập các thuộc tính bổ sung
Mật khẩu thách thức []:
Tên công ty tùy chọn []:
[root@localhost CA]# openssl ca -extensions v3_ca -in keys/thirdCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/thirdCA.crt -cert keys/secondCA.crt -keyfile keys/secondCA.key
Sử dụng cấu hình từ /etc/pki/tls/openssl.cnf
Kiểm tra yêu cầu khớp với chữ ký
Chữ ký hợp lệ
Chi tiết chứng chỉ:
        Số serial: 3 (0x3)
        Thời hạn
            Không Trước: 21/08 09:23:58 2020 GMT
            Không Sau : 19/08 09:23:58 2030 GMT
        Chủ thể:
            countryName               = CN
            stateOrProvinceName       = BJ
            organizationName          = BJ
            organizationalUnitName    = BJ
            commonName                = benet.com
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                8B:6F:B5:3C:8C:0A:26:5B:F6:13:23:A9:21:8F:2E:05:6C:EC:C3:78
            X509v3 Authority Key Identifier: 
                keyid:C0:03:65:8D:DC:95:F2:E1:52:FE:04:65:EF:12:4E:69:8A:C5:F9:24

            X509v3 Basic Constraints: 
                CA:TRUE
Chứng chỉ sẽ được xác nhận đến 19/08 09:43:00 2030 GMT (3650 ngày)
Ký chứng chỉ? [y/n]:y

1/1 yêu cầu chứng chỉ được xác nhận, cam kết? [y/n]y
Ghi cơ sở dữ liệu với 1 mục mới
Cơ sở dữ liệu đã cập nhật

Ký chứng chỉ máy chủ bằng CA cấp 3

[root@localhost CA]# openssl genrsa  -out keys/server.key 2048
Tạo khóa RSA 2048 bit
.......................................................+++
..................................................................................+++
e = 65537 (0x10001)
[root@localhost CA]# openssl rsa -in keys/server.key -out keys/server.key
writing RSA key
[root@localhost CA]#  openssl req -new -days 3650 -key keys/server.key -out keys/server.csr
Bạn sẽ được yêu cầu nhập thông tin sẽ được đưa vào yêu cầu chứng chỉ.
Thông tin này gọi là Distinguished Name (DN).
Một số trường có thể để trống
Một số trường có giá trị mặc định,
Nếu nhập '.', trường sẽ được để trống.
-----
Tên nước (2 ký tự) [XX]:CN
Tỉnh/Thành phố (tên đầy đủ) []:BJ
Tên thành phố [Thành phố Mặc định]:BJ
Tên tổ chức [Công ty Mặc định Ltd]:BJ
Đơn vị tổ chức []:BJ
Tên chung []:golang.com
Địa chỉ email []:

Nhập các thuộc tính bổ sung
Mật khẩu thách thức []:
Tên công ty tùy chọn []:
[root@localhost CA]#  openssl ca -in keys/server.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/server.crt -cert keys/thirdCA.crt -keyfile keys/thirdCA.key
Sử dụng cấu hình từ /etc/pki/tls/openssl.cnf
Kiểm tra yêu cầu khớp với chữ ký
Chữ ký hợp lệ
Chi tiết chứng chỉ:
        Số serial: 4 (0x4)
        Thời hạn
            Không Trước: 21/08 09:43:00 2020 GMT
            Không Sau : 19/08 09:43:00 2030 GMT
        Chủ thể:
            countryName               = CN
            stateOrProvinceName       = BJ
            organizationName          = BJ
            organizationalUnitName    = BJ
            commonName                = golang.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                F9:77:DE:5C:16:CF:D1:9B:7F:96:30:D8:CF:2C:8C:0F:E0:2E:F8:34
            X509v3 Authority Key Identifier: 
                keyid:C1:54:59:0B:84:D7:F5:23:36:FD:AE:AF:E7:3F:30:D6:A7:2A:8B:39

Chứng chỉ sẽ được xác nhận đến 19/08 09:43:00 2030 GMT (3650 ngày)
Ký chứng chỉ? [y/n]:y

1/1 yêu cầu chứng chỉ được xác nhận, cam kết? [y/n]y
Ghi cơ sở dữ liệu với 1 mục mới
Cơ sở dữ liệu đã cập nhật

Thêm CA gốc vào kho tin cậy, CA cấp 2 vào kho trung gian, chứng chỉ máy chủ được thêm theo yêu cầu

Lỗi thường gặp

Trường stateOrProvinceName bắt buộc bị thiếu

Nguyên nhân: Trong openssl.cnf, policy CA có 3 trường match, cần nhập giống nhau hoặc chuyển sang optional

# Chính sách CA
[ policy_match ]
countryName        = match
stateOrProvinceName    = match
organizationName    = match
organizationalUnitName    = optional
commonName        = supplied
emailAddress        = optional

Giải pháp:

Điền lần lượt CN, LiaoNing, ORG

Xóa file và tạo lại chứng chỉ lỗi

LỖI:Số serial 01 đã được phát hành,
      kiểm tra cơ sở dữ liệu/serial_file bị hỏng

OpenSSL thừa nhận đây là lỗi

Giải pháp: Tệp /etc/pki/CA/serial khi xóa vẫn ghi lại số lần tạo, cần chỉnh sửa thành số lớn

Lỗi

không thể cập nhật cơ sở dữ liệu
TXT_DB lỗi số 2

Đây cũng là lỗi, có ba phương án

Nguyên nhân: Xảy ra khi các chứng chỉ có dữ liệu trùng lặp. Không thể có hai chứng chỉ giống nhau hoàn toàn. Phương án 1: Thay đổi unique_subject = yes thành unique_subject = no trong index.txt.attr Phương án 2: Xóa index.txt và tạo lại: rm index.txt touch index.txt Phương án 3: Thiết lập common name khác nhau

OpenSSL sửa lỗi này vào tháng 6/2014 http://rt.openssl.org/Ticket/Display.html?id=502&user=guest&pass=guest

Bổ sung:

Tệp cấu hình openssl.cnf đầy đủ trên CentOS7.X

[root@localhost ~]# cat /etc/pki/tls/openssl.cnf
HOME            = .
RANDFILE        = $ENV::HOME/.rnd
oid_section        = new_oids
[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7
[ ca ]
default_ca    = CA_default        # Phần ca mặc định
[ CA_default ]
dir        = /etc/pki/CA        # Thư mục chứa dữ liệu
certs        = $dir/certs        # Chỗ lưu chứng chỉ đã cấp
crl_dir        = $dir/crl        # Chỗ lưu CRL
database    = $dir/index.txt    # Tệp dữ liệu
new_certs_dir    = $dir/newcerts        # Thư mục mới cho chứng chỉ
certificate    = $dir/cacert.pem     # Chứng chỉ CA
serial        = $dir/serial         # Số serial hiện tại
crlnumber    = $dir/crlnumber    # Số CRL hiện tại
crl        = $dir/crl.pem         # CRL hiện tại
private_key    = $dir/private/cakey.pem# Khóa riêng
RANDFILE    = $dir/private/.rand    # Tệp số ngẫu nhiên
x509_extensions    = usr_cert        # Mở rộng thêm vào chứng chỉ
name_opt     = ca_default        # Tùy chọn tên chủ thể
cert_opt     = ca_default        # Tùy chọn chứng chỉ
default_days    = 365            # Thời hạn cấp
default_crl_days= 30            # Thời hạn CRL
default_md    = sha256        # Sử dụng SHA-256 mặc định
preserve    = no            # Giữ nguyên thứ tự DN
policy        = policy_match
[ policy_match ]
countryName        = match
stateOrProvinceName    = match
organizationName    = match
organizationalUnitName    = optional
commonName        = supplied
emailAddress        = optional
[ policy_anything ]
countryName        = optional
stateOrProvinceName    = optional
localityName        = optional
organizationName    = optional
organizationalUnitName    = optional
commonName        = supplied
emailAddress        = optional
[ req ]
default_bits        = 2048
default_md        = sha256
default_keyfile     = privkey.pem
distinguished_name    = req_distinguished_name
attributes        = req_attributes
x509_extensions    = v3_ca    # Mở rộng cho chứng chỉ tự ký
string_mask = utf8only
[ req_distinguished_name ]
countryName            = Tên nước (2 ký tự)
countryName_default        = XX
countryName_min            = 2
countryName_max            = 2
stateOrProvinceName        = Tỉnh/Thành phố (tên đầy đủ)
localityName            = Tên thành phố
localityName_default        = Thành phố Mặc định
0.organizationName        = Tên tổ chức
0.organizationName_default    = Công ty Mặc định Ltd
organizationalUnitName        = Đơn vị tổ chức
commonName            = Tên chung
commonName_max            = 64
emailAddress            = Email
emailAddress_max        = 64
[ req_attributes ]
challengePassword        = Mật khẩu thách thức
challengePassword_min        = 4
challengePassword_max        = 20
unstructuredName        = Tên công ty tùy chọn
[ usr_cert ]
basicConstraints=CA:FALSE
nsComment            = "Chứng chỉ do OpenSSL tạo"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
[ crl_ext ]
authorityKeyIdentifier=keyid:always
[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment            = "Chứng chỉ do OpenSSL tạo"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
[ tsa ]
default_tsa = tsa_config1    # Phần TSA mặc định
[ tsa_config1 ]
dir        = ./demoCA        # Thư mục TSA
serial        = $dir/tsaserial    # Số serial (bắt buộc)
crypto_device    = builtin        # Thiết bị mã hóa
signer_cert    = $dir/tsacert.pem     # Chứng chỉ ký TSA
certs        = $dir/cacert.pem    # Chuỗi chứng chỉ
signer_key    = $dir/private/tsakey.pem # Khóa riêng TSA
default_policy    = tsa_policy1        # Chính sách mặc định
other_policies    = tsa_policy2, tsa_policy3    # Chính sách chấp nhận
digests        = sha1, sha256, sha384, sha512    # Băm chấp nhận
accuracy    = secs:1, millisecs:500, microsecs:100    # Độ chính xác
clock_precision_digits  = 0    # Số chữ số sau dấu chấm
ordering        = yes    # Có định nghĩa thứ tự?
tsa_name        = yes    # Phải có tên TSA?
ess_cert_id_chain    = no    # Phải có chuỗi ESS?

Thẻ: openssl chứng chỉ ssl mã hóa

Đăng vào ngày 28 tháng 6 lúc 23:24