Архив метки: ssl

Обновление SSL-сертификатов LetsEncrypt для MS Exchange (autodiscover и webmail)

1. Через certbot выпустить сертификаты letsencrypt:

$ sudo certbot certonly --manual -d webmail.mydomain.ru --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01
$ sudo certbot certonly --manual -d autodiscover.mydomain.ru --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01

Для подтверждения домена редактировать записи DNS на хостинге. Проверять, что DNS-записи обновились, через любой Linux:

$ dig _acme-challenge.autodiscover.mydomain.ru txt @8.8.8.8

2. Забрать готовые сертификаты fullchain.pem* и ключи privkey.pem* из папки /etc/letsencrypt/archive/
3. Сделать из файлов .pem сертификаты .pfx через программу openssl:

>"C:\Program Files\OpenSSL-Win64\bin\openssl.exe" pkcs12 -inkey privkey3.pem -in fullchain3.pem -export -out autodicover_20190417.pfx

4. Загрузить в MS Exchange сертификаты .pfx («Import Exchange Certificate...»)

5. Выбрать для чего использовать сертификаты (Assign Services to Certificate):
webmail — IMAP, POP, SMTP, IIS
autodiscover — SMTP

https-клиент на python

Скрипт читает в переменную содержимое html-страницы:

# -*- coding: utf-8 -*-
import http.client
import ssl
print('Program started')

#выполнить http-запрос
print('Sending request to site...')
#https://stackoverflow.com/questions/39945702/httplib-httpsconnection-issue-certificate-verify-failed#39945733
conn = http.client.HTTPSConnection('kmsvsr.ru', timeout=5, context=ssl._create_unverified_context())

conn.request("GET", "/")
resp = conn.getresponse()
print(resp.status, resp.reason)

print('Reading answer...')
data = resp.read().decode()
print (data)

Скрипт не дописан, кто будет пользоваться — не забудьте добавить сюда обработку ошибок. А так по быстрому спарсить страницу пойдёт.

Из обобенностей: здесь в примере открывается сайт не по HTTP, а по HTTPS, при чём включен игнор ошибок, то есть код можно использовать для парсинга сайтов с самоподписанными сертификатами.

Быстрая настройка тестового https-сервера

Инструкция по бстрому созданию https-сервера. Просто как по быстрому всё поднять без оглядки на безопасность. Использовался Linux Mint 17.3 загруженнй с live-usb флэшки

1. Устанавливаем веб-сервер

mint@mint ~ $ sudo apt-get install nginx php5

2. Создаём самоподписанный сертификат по инструкции https://devcenter.heroku.com/articles/ssl-certificate-self

mint@mint ~ $ which openssl
/usr/bin/openssl
mint@mint ~ $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
Generating RSA private key, 2048 bit long modulus
……….+++
…………………………………………………………………………….+++
e is 65537 (0x10001)
mint@mint ~ $ ls
Desktop    Downloads  Pictures  server.pass.key  Videos
Documents  Music      Public    Templates
mint@mint ~ $ openssl rsa -passin pass:x -in server.pass.key -out server.key
writing RSA key
mint@mint ~ $ ls
Desktop    Downloads  Pictures  server.key       Templates
Documents  Music      Public    server.pass.key  Videos
mint@mint ~ $ openssl req -new -key server.key  -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——
Country Name (2 letter code) [AU]:Russia
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:66
Locality Name (eg, city) []:Ekaterinburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PupkinCorp
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:test@localhost

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
mint@mint ~ $ ls
Desktop    Downloads  Pictures  server.csr  server.pass.key  Videos
Documents  Music      Public    server.key  Templates
mint@mint ~ $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=RU/ST=66/L=Ekaterinburg/O=PupkinCorp/OU=IT/CN=localhost/emailAddress=test@localhost
Getting Private key
mint@mint ~ $

3. Копируем сертификат и ключ в папку с конфигами nginx

mint@mint ~ $ sudo cp server.key /etc/nginx/
mint@mint ~ $ sudo cp server.crt /etc/nginx/
mint@mint ~ $ sudo bash
mint ~ # cd /etc/nginx/
mint nginx # ls
conf.d          mime.types           nginx.conf    server.key       win-utf
fastcgi_params  naxsi_core.rules     proxy_params  sites-available
koi-utf         naxsi.rules          scgi_params   sites-enabled
koi-win         naxsi-ui.conf.1.4.1  server.crt    uwsgi_params

4. Правим конфиг веб-сервера — снимаем комментарии с секции про HTTPS и вписываем имена файлов нашего сертификата и ключа (подглядывал в http://nginx.org/en/docs/http/configuring_https_servers.html)

mint nginx # nano sites-enabled/default

# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;

root html;
index index.html index.htm;

ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;

ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers «HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES»;
ssl_prefer_server_ciphers on;

location / {
try_files $uri $uri/ =404;
}
}

5. Сохраняемся и перезапускаем веб-сервер

mint sites-available # service nginx stop
mint sites-available # service nginx start

6. В браузере открываем https://localhost/, добавляем исключение (браузер будет ругаться, что сертификат самоподписанный), после этого должны увидеть «Welcome to nginx!» — это будет значить, что успешно через HTTPS открылся файл /usr/share/nginx/html/index.html.

У кого будут замечания и полезне советы, как всё это сделать правильнее — отписывайтесь.