Self-signed Certificate là gì? 3 bước tạo & 5 lưu ý cần biết

  • Home
  • Blog
  • Self-signed Certificate là gì? 3 bước tạo & 5 lưu ý cần biết
DateTh9 22, 2025

Rate this post

Khi phát triển web, bạn chắc chắn đã gặp cảnh báo “Kết nối của bạn không phải là riêng tư (NET::ERR_CERT_AUTHORITY_INVALID). Thủ phạm phổ biến chính là Self-signed Certificate (chứng chỉ tự ký). Vậy chính xác Self-signed Certificate là gì? Tại sao nó vẫn mã hóa dữ liệu nhưng lại bị trình duyệt cảnh báo? Bài viết này sẽ giải thích rõ ràng bản chất của chứng chỉ tự ký, hướng dẫn các trường hợp sử dụng an toàn và chỉ ra những rủi ro cần tránh tuyệt đối.

Self-signed Certificate là gì?

Self-signed Certificate là một chứng chỉ SSL/TLS do chính người tạo ra nó tự ký, thay vì được ký bởi một Tổ chức phát hành chứng chỉ (Certificate Authority – CA) công cộng và đáng tin cậy.

  • Giống chứng chỉ do CA cấp: Nó cung cấp khả năng mã hóa mạnh mẽ, bảo vệ dữ liệu trên đường truyền khỏi bị nghe lén.
  • Khác biệt cốt lõi: Nó thiếu sự xác thực danh tính từ một bên thứ ba uy tín.

Ví dụ đơn giản: Một chứng chỉ do CA cấp giống như Căn cước công dân do nhà nước cấp, được mọi nơi công nhận. Còn chứng chỉ tự ký giống như bạn tự làm một tấm thẻ thông tin và tự ký tên—nó không có giá trị xác thực với người khác.

Vì không có CA uy tín nào bảo lãnh, trình duyệt không thể xác minh danh tính máy chủ bạn đang kết nối. Đây chính là lý do gây ra cảnh báo bảo mật.

Self-signed Certificate là gì

Self-signed Certificate là gì

Tại sao Self-signed Certificate không được Tin cậy? Tìm hiểu về “Chain of Trust”

Để hiểu tại sao một chứng chỉ tự ký lại không được tin cậy, chúng ta cần phải nắm được cách mà hệ thống tin cậy trên Internet hoạt động. Nền tảng của hệ thống này được gọi là Cơ sở hạ tầng khóa công khai (Public Key Infrastructure – PKI), và trái tim của PKI chính là khái niệm về “Chuỗi tin cậy” (Chain of Trust).

Chuỗi tin cậy này hoạt động theo một hệ thống phân cấp rõ ràng.

CA Gốc (Root CA):

Đứng ở đỉnh của chuỗi tin cậy là các Tổ chức phát hành chứng chỉ gốc. Đây là những tổ chức có uy tín rất cao và đã trải qua các cuộc kiểm toán an ninh nghiêm ngặt.

Chứng chỉ của các CA Gốc này được cài đặt sẵn và tin tưởng một cách tuyệt đối trong kho lưu trữ của hầu hết các hệ điều hành (Windows, macOS, Linux, Android, iOS) và trình duyệt web (Chrome, Firefox, Safari). Một vài cái tên tiêu biểu trong nhóm này là DigiCert, Sectigo, GlobalSign.

CA Trung gian (Intermediate CA):

Vì lý do bảo mật, các CA Gốc thường không trực tiếp ký cho các chứng chỉ của người dùng cuối. Thay vào đó, họ sẽ ký và cấp phát chứng chỉ cho các CA Trung gian. Các CA Trung gian này sau đó sẽ thay mặt CA Gốc để cấp phát chứng chỉ cho các website.

Chứng chỉ của người dùng cuối (End-entity Certificate):

Đây là chứng chỉ SSL mà bạn cài đặt trên máy chủ web của mình. Khi bạn truy cập một website sử dụng HTTPS, trình duyệt sẽ kiểm tra chứng chỉ của website đó. Nó sẽ xem ai đã ký chứng chỉ này (một CA Trung gian), sau đó lại kiểm tra xem ai đã ký cho CA Trung gian đó.

Quá trình này tiếp tục cho đến khi trình duyệt tìm thấy một CA Gốc mà nó tin tưởng trong kho lưu trữ của mình. Nếu chuỗi này hoàn chỉnh và hợp lệ, trình duyệt sẽ hiển thị biểu tượng ổ khóa an toàn.

Nếu chuỗi bị đứt gãy ở bất kỳ đâu, hoặc chứng chỉ cuối cùng không thể truy ngược về một CA Gốc đáng tin cậy, cảnh báo bảo mật sẽ xuất hiện. Đây chính là những gì xảy ra khi bạn dùng một chứng chỉ tự ký.

Cơ quan cấp Chứng chỉ thương mại

Cơ quan cấp Chứng chỉ thương mại

Việc hiểu về các cơ quan cấp chứng chỉ thương mại và chuỗi tin cậy là điều kiện tiên quyết để phân biệt và đánh giá đúng vai trò của một chứng chỉ tự ký. Bạn sẽ hiểu rằng vấn đề của Self-signed Certificate là gì không nằm ở khả năng mã hóa, mà nằm ở vị trí của nó bên ngoài chuỗi tin cậy toàn cầu này.

So sánh Self-signed Certificate với Let’s Encrypt

Trong cuộc thảo luận về chứng chỉ SSL, Let’s Encrypt là một cái tên không thể không nhắc đến. Đây là một Tổ chức phát hành chứng chỉ (CA) công cộng, được tin cậy rộng rãi bởi mọi trình duyệt, nhưng lại cung cấp chứng chỉ hoàn toàn miễn phí. Sự xuất hiện của Let’s Encrypt giúp chúng ta làm rõ một ranh giới quan trọng: “được tin cậy” (trusted) không nhất thiết phải đồng nghĩa với “trả phí” (paid).

Vậy Let’s Encrypt khác với một chứng chỉ tự ký ở điểm nào?

Điểm khác biệt cốt lõi vẫn nằm ở “Chuỗi tin cậy”. Let’s Encrypt là một CA được công nhận. Chứng chỉ do Let’s Encrypt cấp có thể được truy ngược về CA gốc của họ (ISRG Root X1), một CA được tin tưởng bởi hầu hết các hệ điều hành và trình duyệt. Do đó, khi bạn cài đặt chứng chỉ Let’s Encrypt, trình duyệt sẽ xác thực thành công và không hiển thị bất kỳ cảnh báo nào.

Ngược lại, như đã phân tích, một Self-signed Certificate là một thực thể đứng một mình, nó tự làm gốc (root) cho chính nó. Vì CA tự tạo này không nằm trong danh sách được tin cậy sẵn có của trình duyệt, nên cảnh báo bảo mật là điều không thể tránh khỏi.

Một điểm quan trọng khác cần nhấn mạnh là giới hạn của Let’s Encrypt. Giao thức xác thực của Let’s Encrypt yêu cầu máy chủ của bạn phải có thể truy cập được từ Internet công cộng. Điều này có nghĩa là bạn không thể sử dụng Let’s Encrypt để cấp chứng chỉ cho các trường hợp sau:

  • Máy chủ phát triển trên máy tính cá nhân của bạn (localhost).
  • Các máy chủ trong mạng nội bộ (intranet) không có địa chỉ IP công cộng.
  • Các tên miền nội bộ (ví dụ: gitlab.mycompany.local).

Đây chính là những tình huống mà một chứng chỉ tự ký trở thành một công cụ hữu ích và đôi khi là lựa chọn duy nhất. Việc so sánh này giúp chúng ta định vị chính xác vai trò của Self-signed Certificate là gì: một công cụ cho các môi trường không công cộng, nơi mà các CA công cộng như Let’s Encrypt không thể tiếp cận.

Tại sao trình duyệt lại hiển thị cảnh báo “Your connection is not private”?

Khi bạn truy cập một dịch vụ sử dụng chứng chỉ tự ký, trình duyệt sẽ chặn kết nối và hiển thị một trang cảnh báo lớn màu đỏ với các thông báo như “Kết nối của bạn không phải là kết nối riêng tư” (Your connection is not private) kèm theo mã lỗi cụ thể, thường gặp nhất là NET::ERR_CERT_AUTHORITY_INVALID.

Lý do trình duyệt làm vậy là vì nó đang thực hiện đúng chức năng bảo vệ người dùng của mình. Quá trình kiểm tra của trình duyệt khi gặp chứng chỉ này có thể được diễn giải như sau:

  1. “Tôi nhận được một chứng chỉ SSL từ máy chủ này. Điều này tốt, có nghĩa là kết nối sẽ được mã hóa.”
  2. “Bây giờ tôi cần xem ai đã cấp phát (ký) chứng chỉ này. À, chứng chỉ này tự ký cho chính nó.”
  3. “Tôi sẽ kiểm tra xem ‘nhà phát hành’ này (chính là máy chủ đó) có nằm trong danh sách các CA Gốc đáng tin cậy của tôi không.”
  4. “Không, tôi chưa từng nghe về nhà phát hành này. Tôi không có cơ sở nào để tin rằng máy chủ mà tôi đang nói chuyện thực sự là máy chủ mà người dùng muốn truy cập.”
  5. “Vì không thể xác thực danh tính, có khả năng người dùng đang bị tấn công Man-in-the-Middle (Kẻ đứng giữa). Một kẻ tấn công có thể đã chặn kết nối và đưa ra một chứng chỉ giả mạo. Vì vậy, tôi phải chặn kết nối và cảnh báo người dùng về rủi ro này.”

Như vậy, cảnh báo này không có nghĩa là kết nối không được mã hóa. Nó có nghĩa là trình duyệt không thể xác minh danh tính của đối phương. Hiểu rõ logic này là bước đầu tiên để sử dụng chứng chỉ tự ký một cách đúng đắn.

Các trường hợp nên sử dụng chứng chỉ Self-signed Certificate

Mặc dù có cảnh báo từ trình duyệt, chứng chỉ tự ký vẫn là một công cụ vô cùng hữu ích trong các bối cảnh phù hợp. Dưới đây là những trường hợp sử dụng phổ biến và hợp lý nhất:

Môi trường phát triển (Development Environment)

Đây là trường hợp sử dụng phổ biến nhất. Nhiều API và tính năng của trình duyệt hiện đại (như Service Workers, Geolocation API) yêu cầu phải được chạy trên một môi trường an toàn (HTTPS).

Khi bạn đang lập trình trên máy tính cá nhân (localhost), việc sử dụng chứng chỉ tự ký là cách nhanh nhất để tạo ra một môi trường https://localhost, cho phép bạn phát triển và gỡ lỗi các tính năng này một cách hiệu quả.

Môi trường thử nghiệm nội bộ (Staging/Testing Environment)

Trước khi triển khai ứng dụng ra môi trường sản phẩm thật, các đội phát triển thường có một môi trường staging để kiểm thử lần cuối. Các môi trường này thường nằm trong mạng nội bộ.

Việc sử dụng chứng chỉ tự ký giúp đảm bảo tính nhất quán về mặt cấu hình mã hóa giữa môi trường staging và production mà không cần phải mua chứng chỉ thương mại cho một máy chủ không công khai.

Các dịch vụ mạng nội bộ (Internal Network Services)

Trong một mạng công ty, có rất nhiều dịch vụ nội bộ có giao diện quản lý qua web. Việc mã hóa kết nối đến các giao diện này là rất quan trọng để tránh bị nghe lén mật khẩu quản trị.

Ví dụ:

  • Giao diện quản trị của các thiết bị mạng như router, switch, firewall.
  • Các máy chủ quản lý và giám sát nội bộ như Nagios, Zabbix, Grafana.
  • Các máy chủ quản lý mã nguồn nội bộ như GitLab, Gitea.
  • Các giao diện quản lý máy ảo như Proxmox VE.

Trong tất cả các trường hợp trên, vì các dịch vụ này chỉ được truy cập bởi những người dùng tin cậy trong mạng nội bộ, việc sử dụng Self-signed Certificate để mã hóa là hoàn toàn chấp nhận được.

Rủi ro và khi nào tuyệt đối không dùng Self-signed Certificate?

Tuyệt đối không sử dụng chứng chỉ tự ký cho bất kỳ website hay dịch vụ nào hướng ra Internet công cộng, đặc biệt là các trang thương mại điện tử, ngân hàng, mạng xã hội, hoặc bất kỳ trang nào yêu cầu người dùng đăng nhập và xử lý dữ liệu nhạy cảm.

Rủi ro & Khi nào tuyệt đối không được sử dụng

Rủi ro & Khi nào tuyệt đối không được sử dụng

Lý do là vì nó tạo ra một lỗ hổng bảo mật nghiêm trọng, mở đường cho các cuộc tấn công Man-in-the-Middle (MitM). Kịch bản tấn công có thể diễn ra như sau:

  • Người dùng cố gắng truy cập website của bạn.
  • Kẻ tấn công chặn kết nối này và tạo ra một chứng chỉ tự ký giả mạo cho tên miền của bạn.
  • Kẻ tấn công trả về chứng chỉ giả mạo này cho người dùng.
  • Người dùng sẽ thấy cảnh báo lỗi chứng chỉ. Tuy nhiên, nếu website của bạn vốn dĩ cũng dùng chứng chỉ tự ký, người dùng đã quen với việc bấm “Proceed anyway” (Tiếp tục truy cập). Họ sẽ không thể phân biệt được đâu là cảnh báo “an toàn” (từ chứng chỉ của bạn) và đâu là cảnh báo “nguy hiểm” (từ chứng chỉ của kẻ tấn công).
  • Một khi người dùng bỏ qua cảnh báo, kẻ tấn công sẽ đứng giữa, giải mã toàn bộ dữ liệu người dùng gửi đi (bao gồm tên đăng nhập, mật khẩu, thông tin thẻ tín dụng), sau đó mã hóa lại và gửi tiếp đến máy chủ của bạn.

Việc hướng dẫn người dùng bỏ qua cảnh báo bảo mật là một hành động cực kỳ nguy hiểm, làm xói mòn nhận thức về an ninh mạng của họ. Do đó, hãy luôn sử dụng chứng chỉ từ một CA công cộng đáng tin cậy cho môi trường production.

Hướng dẫn tạo chứng chỉ Self-signed Certificate bằng OpenSSL

OpenSSL là một bộ công cụ dòng lệnh mạnh mẽ và có sẵn trên hầu hết các hệ điều hành Linux và macOS. Dưới đây là câu lệnh phổ biến để tạo một chứng chỉ tự ký có hiệu lực trong 365 ngày, đi kèm với một khóa riêng tư 2048-bit. Tại thuemaychugiare, chúng tôi thường xuyên sử dụng công cụ này để thiết lập môi trường nội bộ cho khách hàng.

Bạn có thể chạy câu lệnh sau trong terminal:

Bash
📋
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate.crt

Hãy cùng phân tích từng tham số:

  • openssl req: Lệnh để xử lý Yêu cầu ký chứng chỉ (Certificate Signing Request – CSR).
  • -x509: Tùy chọn này chỉ định rằng chúng ta muốn tạo một chứng chỉ tự ký thay vì tạo một CSR.
  • -nodes: Viết tắt của “no DES”. Tùy chọn này đảm bảo khóa riêng tư (private.key) không bị mã hóa bằng mật khẩu. Điều này tiện lợi cho các máy chủ web tự khởi động mà không cần người quản trị nhập mật khẩu.
  • -days 365: Đặt thời hạn hiệu lực của chứng chỉ là 365 ngày.
  • -newkey rsa:2048: Tạo một cặp khóa mới sử dụng thuật toán RSA với độ dài 2048-bit.
  • keyout private.key: Chỉ định tên file để lưu khóa riêng tư.
  • -out certificate.crt: Chỉ định tên file để lưu chứng chỉ.

Sau khi chạy lệnh, OpenSSL sẽ yêu cầu bạn nhập một số thông tin (Distinguished Name – DN) như Tên quốc gia, Tỉnh/Thành phố, Tên tổ chức… Đối với chứng chỉ tự ký, thông tin quan trọng nhất là Common Name (CN). Bạn nên đặt Common Name là tên miền hoặc địa chỉ IP mà bạn muốn bảo mật (ví dụ: localhost hoặc gitlab.mycompany.local).

Cách xử lý cảnh báo: Hướng dẫn trình duyệt “tin tưởng” Self-signed Certificate

Khi làm việc trong môi trường phát triển, việc phải bấm bỏ qua cảnh báo mỗi lần tải lại trang là rất phiền phức. Để giải quyết vấn đề này, bạn có thể hướng dẫn hệ điều hành hoặc trình duyệt của mình “tin tưởng” vào chứng chỉ tự ký mà bạn đã tạo.

Cách thực hiện sẽ khác nhau tùy theo hệ điều hành:

  • Trên Windows: Bạn cần nhập file certificate.crt vào kho lưu trữ chứng chỉ của máy tính. Mở certmgr.msc, tìm đến thư mục Trusted Root Certification Authorities -> Certificates, sau đó nhấp chuột phải và chọn All Tasks -> Import… rồi làm theo hướng dẫn để chọn file .crt của bạn.
  • Trên macOS: Mở ứng dụng Keychain Access (Quản lý chuỗi khóa). Kéo thả file certificate.crt vào mục System. Sau đó, tìm chứng chỉ bạn vừa nhập, mở nó ra, trong phần Trust (Tin cậy), thay đổi tùy chọn When using this certificate thành Always Trust (Luôn tin cậy).
  • Trên Linux: Quá trình phức tạp hơn một chút và phụ thuộc vào bản phân phối. Thường thì bạn sẽ cần sao chép file .crt vào thư mục /usr/local/share/ca-certificates/ rồi chạy lệnh sudo update-ca-certificates.
  • Đối với Firefox: Firefox có kho lưu trữ chứng chỉ riêng. Bạn cần vào Settings -> Privacy & Security -> Certificates -> View Certificates…, trong tab Authorities, chọn Import… và chọn file .crt của bạn, sau đó đánh dấu vào ô “Trust this CA to identify websites”.

Sau khi thực hiện các bước này, khi bạn truy cập lại dịch vụ, trình duyệt sẽ nhận ra chứng chỉ này đã được tin cậy thủ công và sẽ không hiển thị cảnh báo nữa.

Cơ quan phát hành Chứng chỉ Cá nhân

Khi bạn cần quản lý SSL cho nhiều dịch vụ nội bộ trong một tổ chức, việc tạo và tin tưởng từng chứng chỉ tự ký riêng lẻ trở nên không hiệu quả và khó quản lý. Đây là lúc giải pháp nâng cao hơn được đưa ra: xây dựng một Cơ quan phát hành Chứng chỉ Cá nhân (Private CA).

Một Private CA về cơ bản là bạn tự tạo ra một CA Gốc của riêng mình. CA này sẽ không được thế giới công nhận, nhưng nó sẽ là nguồn tin cậy duy nhất cho toàn bộ hệ thống nội bộ của bạn.

Quy trình hoạt động như sau:

  1. Tạo CA Gốc nội bộ: Bạn sử dụng các công cụ như OpenSSL hoặc step-ca để tạo ra một cặp khóa và một chứng chỉ gốc cho CA của riêng mình (ví dụ: MyCompanyInternalCA).
  2. Phân phối và Tin tưởng CA Gốc: Bạn chỉ cần phân phối chứng chỉ của CA Gốc này (MyCompanyInternalCA.crt) đến tất cả các máy tính của nhân viên trong công ty và hướng dẫn họ nhập nó vào kho lưu trữ chứng chỉ tin cậy của hệ điều hành (giống như cách đã làm với chứng chỉ tự ký ở trên). Đây là bước chỉ cần làm một lần duy nhất.
  3. Cấp phát chứng chỉ cho dịch vụ: Từ bây giờ, mỗi khi bạn cần một chứng chỉ SSL cho một dịch vụ nội bộ mới (ví dụ: jenkins.mycompany.local), bạn sẽ không tạo chứng chỉ tự ký nữa. Thay vào đó, bạn sẽ dùng CA Gốc nội bộ của mình để ký và cấp phát một chứng chỉ hợp lệ cho dịch vụ đó.

Kết quả là, vì tất cả các máy tính trong công ty đã tin tưởng MyCompanyInternalCA, mọi chứng chỉ được ký bởi CA này sẽ tự động được công nhận. Không còn bất kỳ cảnh báo bảo mật nào xuất hiện khi nhân viên truy cập các dịch vụ nội bộ nữa. Đây là một giải pháp chuyên nghiệp, an toàn và có khả năng mở rộng cao cho môi trường doanh nghiệp.

Kết luận

Qua bài phân tích chi tiết này, thuemaychugiare hy vọng bạn đã có câu trả lời toàn diện cho câu hỏi Self-signed Certificate là gì. Đây là một công cụ kỹ thuật có giá trị, giúp mang lại lớp mã hóa cần thiết cho các môi trường không công cộng như phát triển, thử nghiệm và các dịch vụ nội bộ. Việc hiểu rõ bản chất “tự ký” của nó giúp chúng ta lý giải được tại sao trình duyệt lại đưa ra cảnh báo bảo mật.

Điều quan trọng nhất cần nhớ là phải sử dụng đúng công cụ cho đúng mục đích. Chứng chỉ tự ký là lựa chọn tuyệt vời để bật HTTPS nhanh chóng cho localhost hay máy chủ GitLab nội bộ của bạn.

Tuy nhiên, nó không bao giờ được phép trở thành sự thay thế cho một chứng chỉ được cấp bởi CA công cộng đáng tin cậy trên các website sản phẩm của bạn. Việc áp dụng đúng đắn sẽ giúp bạn vừa tối ưu hóa được quy trình làm việc, vừa không tạo ra những rủi ro bảo mật không đáng có cho người dùng cuối.

Để lại một bình luận