Chuyển đổi chứng chỉ SSL bằng OpenSSL
Hướng dẫn Tên miền & SSL · cập nhật 07/08/2026
Để chuyển đổi chứng chỉ SSL bằng OpenSSL, bạn xác định định dạng file đang có, tìm cặp định dạng nguồn và đích trong bảng lệnh bên dưới rồi chạy đúng dòng đó. Mỗi lượt chuyển mất vài giây, phần lâu nhất là tìm ra file hiện tại đang ở định dạng nào.
Việc này gặp khi nhà cung cấp cấp chứng chỉ theo một định dạng còn máy chủ đích lại đòi định dạng khác. Apache và Nginx đọc PEM, IIS đọc PFX, Tomcat và các máy chủ Java đọc P7B hoặc JKS, còn thiết bị mạng có khi chỉ nhận DER.
- Nhận diện định dạng của file đang có.
- Tra bảng để biết máy chủ đích cần định dạng nào.
- Chạy lệnh chuyển đổi tương ứng.
- Mở file kết quả bằng OpenSSL để xác nhận nội dung còn đủ.
Các lệnh dưới đây chạy được trên OpenSSL 1.1.1 và 3.x, trên Linux, macOS lẫn Windows. Trên Windows cần cài OpenSSL trước, xem hướng dẫn convert SSL ra PFX trên Windows.
Các định dạng chứng chỉ SSL khác nhau chỗ nào
Chứng chỉ SSL luôn chứa cùng một nội dung, khác nhau ở cách đóng gói. PEM là văn bản mã hoá base64 đọc được bằng Notepad. DER là nhị phân của cùng nội dung đó. PFX và P7B là hai kiểu gói nhiều thành phần vào một file, khác nhau ở chỗ PFX chứa được cả khoá riêng còn P7B thì không.
| Định dạng | Đuôi file | Kiểu nội dung | Chứa khoá riêng | Máy chủ hay dùng |
|---|---|---|---|---|
| PEM | .pem .crt .cer .key | Văn bản base64 | Tách file riêng | Apache, Nginx |
| DER | .der .cer | Nhị phân | Không | Java, thiết bị mạng |
| PKCS#7 | .p7b .p7c | Văn bản base64 | Không | Tomcat, Java keystore |
| PKCS#12 | .pfx .p12 | Nhị phân có mật khẩu | Có | IIS, Exchange, thiết bị cân bằng tải |
| PKCS#8 | .pk8 | Chỉ chứa khoá riêng | Có | Ứng dụng Java, một số SDK |
Cột "chứa khoá riêng" là cột quan trọng nhất. Chuyển từ định dạng có khoá sang định dạng không có khoá thì phần khoá bị bỏ lại, và máy chủ đích sẽ không phục vụ được HTTPS dù đã nạp chứng chỉ. Chiều ngược lại thì phải cấp thêm file khoá riêng vào lệnh.
Cách nhận biết file chứng chỉ đang ở định dạng nào
Đuôi file không đáng tin, vì .cer có thể là PEM cũng có thể là DER, còn .crt thường là PEM nhưng không phải luôn luôn. Cách chắc chắn là mở file bằng trình soạn thảo văn bản và nhìn dòng đầu tiên.
- Bắt đầu bằng
-----BEGIN CERTIFICATE-----: đó là PEM chứa chứng chỉ. - Bắt đầu bằng
-----BEGIN PRIVATE KEY-----hoặc-----BEGIN RSA PRIVATE KEY-----: đó là PEM chứa khoá riêng. - Bắt đầu bằng
-----BEGIN PKCS7-----: đó là P7B. - Mở ra toàn ký tự lạ không đọc được: đó là nhị phân, tức DER hoặc PFX.
Phân biệt DER với PFX thì thử đọc bằng OpenSSL. Lệnh openssl x509 -inform der -in file.cer -noout -text in ra thông tin chứng chỉ thì đó là DER. Nếu báo lỗi mà openssl pkcs12 -info -in file.cer lại hỏi mật khẩu thì đó là PFX.
Lệnh OpenSSL chuyển đổi giữa PEM, DER và P7B
Ba định dạng này đều chỉ chứa chứng chỉ, không kèm khoá riêng, nên lệnh chuyển giữa chúng ngắn và không hỏi mật khẩu. Chép nguyên lệnh rồi thay tên file cho đúng bộ file của bạn.
Chuyển đổi từ PEM sang DER:
openssl x509 -outform der -in certificatename.pem -out certificatename.der
Chuyển đổi từ DER sang PEM:
openssl x509 -inform der -in certificatename.der -out certificatename.pem
Chuyển đổi từ PEM sang P7B:
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
Chuyển đổi từ PKCS7 sang PEM:
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
Chuyển đổi từ CER sang CRT:
openssl x509 -inform PEM -in certificatename.cer -out certificate.crt
Lệnh cuối chỉ đổi tên đuôi file chứ không đổi nội dung, vì CER và CRT ở đây đều là PEM. Nó có ích khi phần mềm đích kiểm đuôi file trước khi nạp và từ chối đuôi lạ.
Lệnh chuyển đổi có kèm khoá riêng sang PFX và PKCS#8
Nhóm lệnh này khác ở chỗ có tham số -inkey hoặc -nocerts, tức là có động tới khoá riêng. Lệnh tạo ra PFX sẽ hỏi mật khẩu xuất, còn lệnh đọc từ PFX sẽ hỏi mật khẩu nhập. Gõ mật khẩu không hiện ký tự trên màn hình là bình thường.
Chuyển đổi từ PFX sang PEM:
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
Chuyển đổi từ CER sang PFX:
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx
Chuyển đổi từ CRT sang PFX:
openssl pkcs12 -export -out certificatename.pfx -inkey privateKey.key -in certificate.crt
Chuyển đổi từ PFX sang PKCS#8, làm hai lượt:
Bước 1: PFX –> PEM
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pemBước 2: PEM –> PKCS8
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
Chuyển đổi từ P7B sang PFX, cũng hai lượt vì P7B không mang khoá riêng nên phải nạp thêm từ ngoài:
Bước 1: P7B –> CER
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cerBước 2: CER & Private Key –> PFX
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx
Tham số -nodes ở bước 1 nghĩa là xuất khoá riêng không mã hoá. File tạo ra đọc thẳng được nên đừng để nó nằm trong thư mục dùng chung, xoá đi sau khi hoàn tất.
Cách kiểm tra file sau khi chuyển đổi
Chuyển xong phải mở lại file bằng OpenSSL để chắc nội dung còn nguyên. Lệnh chạy không báo lỗi vẫn có thể cho ra file thiếu thành phần, thường là mất chứng chỉ trung gian hoặc mất khoá riêng.
Với file PEM hoặc CRT, xem thông tin bên trong:
openssl x509 -in certificatename.pem -noout -text
Với file PFX, liệt kê mọi thứ chứa trong đó:
openssl pkcs12 -info -in certificatename.pfx -nodes
Kết quả cần có tên miền đúng ở dòng Subject, ngày còn hiệu lực ở Not After, và với PFX thì phải thấy cả khối khoá riêng lẫn khối chứng chỉ. Muốn chắc chứng chỉ khớp tên miền và còn hạn, xem thêm bài hướng dẫn xác thực chứng chỉ SSL.
Xử lý các lỗi thường gặp khi chuyển đổi chứng chỉ
Ba thông báo dưới đây chiếm phần lớn ca chuyển đổi chứng chỉ SSL thất bại. OpenSSL in lỗi bằng tiếng Anh ngắn gọn, nhìn dòng đầu là biết ngay nguyên nhân.
unable to load certificate. Bạn đang khai sai định dạng đầu vào, thường là dùng lệnh đọc PEM để đọc file DER. Thêm -inform der vào lệnh, hoặc kiểm lại định dạng thật của file theo cách ở phần trên.
No certificate matches private key. Chứng chỉ và khoá riêng không cùng một cặp. So hai chuỗi băm, giống nhau thì đúng cặp:
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in privateKey.key | openssl md5
Mac verify error: invalid password. Sai mật khẩu file PFX. Không có cách khôi phục, phải xin lại mật khẩu từ người tạo file hoặc tạo lại PFX từ bộ file gốc.
Điều cần nhớ khi làm việc với file chứng chỉ
Mỗi lần chuyển đổi chứng chỉ SSL, giữ lại bộ file gốc mà nhà cung cấp gửi về, đừng chỉ giữ file kết quả. Mọi định dạng khác đều dựng lại được từ bộ gốc, nhưng mất khoá riêng thì không có đường quay lại, chỉ còn cách xin cấp lại chứng chỉ với yêu cầu ký mới.
Khoá riêng nên đặt quyền chmod 600 trên Linux và chỉ để tài khoản quản trị đọc được trên Windows. Đây là thành phần duy nhất trong bộ file không được lộ, còn chứng chỉ thì vốn công khai, bất kỳ ai truy cập website cũng tải về được. Chứng chỉ cấp qua đối tác GoGetSSL đều kèm sẵn CA bundle, giữ file đó lại thì các lượt ghép PFX sau không phải đi xin.
Bài khác trong Tên miền & SSL
Xem cả 19 bàiLàm theo vẫn chưa được?
Gửi yêu cầu hỗ trợ, kỹ thuật xem trực tiếp trên dịch vụ của Anh/Chị.