Если всё делать по стандартному фэн-шую, то никаких отличий от
обыкновенных OpenSSL туториалов то и нет:
0. Если нет уже готового CA (Certificate Authority), то генерируем новый:
ecdsa.GenerateKey()
+
x509.CreateCertificate()
(self-signed).
1. Генерируем приватный ключ PK (Private Key) для своего сертификата:
ecdsa.GenerateKey()
.
2. Генерим запрос на создание сертификата CSR (Certificate Signing Request):
x509.CreateCertificateRequest()
. В качесте
CN (Common Name) указываем тот адрес, по которому будем стучаться к приложению. Если таких адресов предполагается несколько, то используем
SAN расширение в шаблоне сертификата.
3. Берем CA и выпускаем себе сертификат по сгенерированному CSR:
x509.CreateCertificate()
.
4. Используем сертификат для TLS:
http.ServeTLS()
.
Приватный ключ и сертификат (и свой, и CA) сохраняем в любую желаемую директорию в файловой системе. Права к приватным ключам при этом выставляем
0600
. Если это дело всё разовое, то можно и во временную директорию (
os.TempDir()
), чтобы не мусорить.
Если это только чтобы поиграться, и не предполагается выстраивание своей PKI (
Public Key Infrastructure), то можно и не париться с CA/CSR, а сразу выпускать self-signed сертификат с нужными Вам CN/SAN. То есть, остается только нулевой шаг.
Если у нас приложение пырится во внешний мир не "голым", а прикрыто каким-то проксирующим сервером (например, Nginx), что, в принципе, есть даже рекомендуемой практикой, то сертификат можно подключать для нашего хоста прямо там, а приложение оставить себе без TLS. В этом случае Nginx будет расшифровывать трафик у себя и в приложение пробрасывать уже незашифрованный трафик. Подобное называется
терминацией TLS.
Если же мы хотим, чтобы между прокси-сервером и нашим приложением продолжал ходить зашифрованный трафик, то прокси-серверу нужно в настройках скормить наш CA сертификат, либо отключить проверку CA.