Четверг, 26.06.2025, 21:07

Мои инструкции

Меню сайта
Друзья сайта

Документальные фильмы о динозаврах

Установка SSL сертификата на FreeBSD

Настройка Apache SSL на FreeBSD .

Цель этих двух директорий - облегчить управление конфигурацией виртуального

хостинга в системе, без изменения основного файла конфигурации

Apache httpd.conf каждый раз при добавлении нового виртуального хоста.

# mkdir /usr/local/etc/apache24/sites-available

# mkdir /usr/local/etc/apache24/sites-enabled

После того, как вы создали оба каталога, откройте файл Apache httpd.conf

в текстовом редакторе и добавьте следующую строку ближе к концу файла,

как показано ниже.

# ee /usr/local/etc/apache24/httpd.conf

IncludeOptional etc/apache24/sites-enabled/*.conf

А так же снимите префикс :

LoadModule ssl_module libexec/apache24/mod_ssl.so ...... 148 строка .

Затем включите модуль TLS для Apache, создав следующий новый файл с именем

020_mod_ssl.conf в каталоге modules.d со следующим содержимым.

# touch /usr/local/etc/apache24/modules.d/020_mod_ssl.conf

# ee /usr/local/etc/apache24/modules.d/020_mod_ssl.conf

Listen 443
SSLProtocol ALL -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog builtin
SSLSessionCacheTimeout 300

Далее создайте файл конфигурации TLS для вашего домена в каталоге sites-available ,

желательно с именем вашего домена, как показано в приведенном ниже отрывке , а

также создайте файлы логов :

# touch /var/log/dinozavr1967.ssl-error.log / указываете имя своего сайта

# touch /var/log/dinozavr1967.ssl-access_log / указываете имя своего сайта

# touch /var/log/httpd-ssl_request.log

# touch /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf

Создаём директорию для ключей :

Здесь я не совсем уверен ... Возможно при установке ключей директория и так сформируется .

# mkdir /usr/local/etc/letsencrypt/

# mkdir /usr/local/etc/letsencrypt/live/

Впрочем хуже не будет ...

Создаём виртуальный хост в bsd.lan-ssl.conf :

# ee /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf

<VirtualHost *:443>
    ServerName www.dinozavr1967.ru
   ServerAlias dinozavr1967.ru
# DocumentRoot "/usr/local/www/apache24/data/"
   DocumentRoot "/root/torrentpier/" / пример моего пути к сайту
   SSLEngine on
    SSLCertificateFile "/usr/local/etc/letsencrypt/live/dinozavr1967.ru/cert.pem" / При установке ключей домен встанет автоматом
   SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/dinozavr1967.ru/privkey.pem" / При установке ключей домен встанет автоматом
   SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/dinozavr1967.ru/fullchain.pem" / При установке ключей домен встанет автоматом
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/www/apache24/cgi-bin">
   SSLOptions +StdEnvVars
</Directory>
    BrowserMatch "MSIE [2-5]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
    CustomLog "/var/log/httpd-ssl_request.log" \
    "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
<Directory "/usr/local/www/apache24/data/">
   Options Indexes FollowSymLinks MultiViews
# AllowOverride controls what directives may be placed in .htaccess files.
    AllowOverride All
# Controls who can get stuff from this server file
    Require all granted
</Directory>
   ErrorLog "/var/log/dinozavr1967.ssl-error.log" / указываете имя своего сайта
   CustomLog "/var/log/dinozavr1967.ssl-access_log" combined / указываете имя своего сайта
</VirtualHost>

Обязательно замените переменную доменного имени из операторов ServerName ,

ServerAlias , ErrorLog, CustomLog соответственно.

Устанавливаем Lets'Encrypt :

# pkg install py311-certbot

Если выскочит ошибка , то проверьте последнюю версию py-certbot . Цифры могут отличаться .

Генерируем сертификат для домена :

# certbot certonly --webroot -w /root/torrentpier/ -d dinozavr1967.ru -d www.dinozavr1967.ru

/root/torrentpier/ - путь к вашему сайту .

dinozavr1967.ru , www.dinozavr1967.ru - Ваш домен .

При получении сертификата укажите адрес электронной почты

На остальные вопросы просто = y =

root@dinozavr1967:~ # certbot certonly --webroot -w /root/torrentpier/ -d dinozavr1967.ru -d www.dinozavr1967.ru
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): Ваша почта

-----------------------------------------------------------------

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must
agree in order to register with the ACME server. Do you agree?
(Y)es/(N)o: y

-----------------------------------------------------------------

Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
(Y)es/(N)o: y

-----------------------------------------------------------------

Спойлер

Account registered.
Requesting a certificate for dinozavr1967.ru and www.dinozavr1967.ru
Successfully received certificate.
Certificate is saved at: /usr/local/etc/letsencrypt/live/dinozavr1967.ru/fullchain.pem
Key is saved at: /usr/local/etc/letsencrypt/live/dinozavr1967.ru/privkey.pem
This certificate expires on 2025-06-17.
These files will be updated when the certificate renews.
NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the
certificate in the background, but you may need to take steps to enable that functionality.
See https://certbot.org/renewal-setup for instructions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Выполняем команду :

# ln -sf /usr/local/etc/apache24/sites-available/bsd.lan-ssl.conf /usr/local/etc/apache24/sites-enabled/

После того, как вы получили сертификаты для вашего домена,

вы можете выполнить команду ls , чтобы получить список всех

компонентов сертификата (цепочка, закрытый ключ, сертификат),

как показано в примере ниже .

# ls -al /usr/local/etc/letsencrypt/live/dinozavr1967.ru/

Не забывайте , что dinozavr1967.ru это мой домен !

root@dinozavr1967:~ # ls -al /usr/local/etc/letsencrypt/live/dinozavr1967.ru/
total 24
drwxrwxr-x 2 root wheel 512 Mar 18 19:41
. drwxrwxr-x 3 root wheel 512 Mar 18 19:41 ..
-rw-r--r-- 1 root wheel 692 Mar 18 19:41 README
lrwxr-xr-x 1 root wheel 39 Mar 18 19:41 cert.pem -> ../../archive/dinozavr1967.ru/cert1.pem
lrwxr-xr-x 1 root wheel 40 Mar 18 19:41 chain.pem -> ../../archive/dinozavr1967.ru/chain1.pem
lrwxr-xr-x 1 root wheel 44 Mar 18 19:41 fullchain.pem -> ../../archive/dinozavr1967.ru/fullchain1.pem
lrwxr-xr-x 1 root wheel 42 Mar 18 19:41 privkey.pem -> ../../archive/dinozavr1967.ru/privkey1.pem

Редактируем файл :

# ee /etc/defaults/periodic.conf

Добавляем в него следующую строку в соответствующий раздел (weekly):

# weekly
weekly_certbot_enable="YES"

Проверьте конфигурации Apache на возможные синтаксические ошибки

и если синтаксис в порядке, перезапустите демон Apache, выполнив

следующие команды :

# apachectl -t

Если есть ошибки , то исправляем . Если нет то стартуем :

# service apache24 restart

Чтобы проверить, прослушивает ли служба Apache HTTPS порт 443, выполните

следующую команду для вывода списка сетевых сокетов httpd :

# sockstat -4 | grep httpd

Спойлер

root@dinozavr1967:~ # sockstat -4 | grep httpd
www httpd 3162 4 tcp4 *:80 *:*
www httpd 3162 6 tcp4 *:443 *:*
www httpd 3161 4 tcp4 *:80 *:*
www httpd 3161 6 tcp4 *:443 *:*
www httpd 3122 4 tcp4 *:80 *:*
www httpd 3122 6 tcp4 *:443 *:*
www httpd 2132 4 tcp4 *:80 *:*
www httpd 2132 6 tcp4 *:443 *:*
www httpd 2116 4 tcp4 *:80 *:*
www httpd 2116 6 tcp4 *:443 *:*
www httpd 2112 4 tcp4 *:80 *:*
www httpd 2112 6 tcp4 *:443 *:*
www httpd 2111 4 tcp4 *:80 *:*
www httpd 2111 6 tcp4 *:443 *:*
www httpd 2110 4 tcp4 *:80 *:*
www httpd 2110 6 tcp4 *:443 *:*
www httpd 2105 4 tcp4 *:80 *:*
www httpd 2105 6 tcp4 *:443 *:*
www httpd 2103 4 tcp4 *:80 *:*
www httpd 2103 6 tcp4 *:443 *:*
root httpd 2087 4 tcp4 *:80 *:*
root httpd 2087 6 tcp4 *:443 *:*

Чтобы получить дополнительную информацию о выданном сертификате Let’s Encrypt

используйте команду openssl следующим образом .

# openssl s_client -connect dinozavr1967.ru:443

Спойлер

root@dinozavr1967:~ # openssl s_client -connect dinozavr1967.ru:443
CONNECTED(00000003)
depth=0 CN = dinozavr1967.ru
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = dinozavr1967.ru
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = dinozavr1967.ru
verify return:1
---
Certificate chain
0 s:CN = dinozavr1967.ru
i:C = US, O = Let's Encrypt, CN = E5
a:PKEY: id-ecPublicKey, 256 (bit); sigalg: ecdsa-with-SHA384
v:NotBefore: Mar 18 15:43:07 2025 GMT; NotAfter: Jun 16 15:43:06 2025 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDxDCCA0mgAwIBAgISBTlBtlFjnvp7VONuC6hyZJK1MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NTAeFw0yNTAzMTgxNTQzMDdaFw0yNTA2MTYxNTQzMDZaMBoxGDAWBgNVBAMTD2Rp
bm96YXZyMTk2Ny5ydTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJ9SBgjFbPfM
E6G76p7Cik1UWoTbTPTBXx+nz2/iHupgQeVMmtvmAXHtHLozwLtAD5TQ5U8rMoPY
ZDNk/CB7kCajggJVMIICUTAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYB
BQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOgQYZCiUk27
4+Vs9BVg2yYaUgVyMB8GA1UdIwQYMBaAFJ8rX888IU+dBLftKyzExnCL0tcNMFUG
CCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL2U1Lm8ubGVuY3Iub3Jn
MCIGCCsGAQUFBzAChhZodHRwOi8vZTUuaS5sZW5jci5vcmcvMC8GA1UdEQQoMCaC
D2Rpbm96YXZyMTk2Ny5ydYITd3d3LmRpbm96YXZyMTk2Ny5ydTATBgNVHSAEDDAK
MAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8vZTUuYy5sZW5jci5v
cmcvNTQuY3JsMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHcATnWjJ1yaEMM4W2zU
3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGVqiHO8AAABAMASDBGAiEAn/WXCOk2dKu6
tYqORO+Z7hECva3w46cvPiDrp5Xt4Y0CIQC+mFyBBvdbn/uJU8DSMaksgk1FQJut
xoQQH4dXTKmY1gB1AN6FgddQJHxrzcuvVjfF54HGTORu1hdjn480pybJ4r03AAAB
laohzvUAAAQDAEYwRAIgVBA2z/TF/pEt+cZOHvT9dw9BQntvgOjJsMORBUfzzBAC
IF+AXR1S7lbB4Oq0wjeYjSPQkJ3RjB3tk02sCXiJHpb4MAoGCCqGSM49BAMDA2kA
MGYCMQDJu2tridLBqe/SKAt85nipJfwxVgpvCmMX23TgrNRu9iT2knhHBxAZ3bmq
+1fxA9MCMQCBqWEhwxOYzOwEmF12xEP8ti4k17G6RRrwTceYWHYUadHjwMiKKUqE
pJG4Gt1CYL8=
-----END CERTIFICATE-----
subject=CN = dinozavr1967.ru
issuer=C = US, O = Let's Encrypt, CN = E5
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1342 bytes and written 401 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 00F8ABB9B45CD2D5160C0DB96DA22DE17862ABCFBC3840E57A574A5F15CE2971
Session-ID-ctx:
Resumption PSK: B61C9A310E07D8D95050EE6A083734E8ACE3B848DC6FB1BC11664A60CA88A0854E07ED19DB3F65DF9A97DB2CEEEBA791
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 55 67 27 09 e6 ae 0d 6d-4d 46 90 5f 40 aa 1e f0 Ug'....mMF._@...
0010 - fc de 0a a1 60 fd 38 11-6c 13 9b de d9 ef ea 33 ....`.8.l......3
0020 - 01 fc fb ab 73 90 cb 8b-e9 1b ff 1d 2e 7b 92 4d ....s........{.M
0030 - d1 17 eb 94 97 e4 0b 49-42 fa 52 1b a4 5d df 01 .......IB.R..]..
0040 - 69 a8 0f f4 26 50 cf d2-a9 c8 d1 37 1b 49 1c 65 i...&P.....7.I.e
0050 - 19 e1 1c 80 4a 4f 68 a0-0e af 9d e0 21 92 29 df ....JOh.....!.).
0060 - b1 cf dc 44 0b 2f a1 3d-00 90 50 52 6e 70 38 2a ...D./.=..PRnp8*
0070 - f6 8c fd 99 9f b5 1c 6d-38 f7 4d 01 c9 ef 4f e4 .......m8.M...O.
0080 - 41 9d b8 a7 04 82 e3 01-e5 aa ab 69 7f 0c 57 33 A..........i..W3
0090 - 42 1a 90 85 f2 50 a4 a9-14 be f1 19 32 7b 2b b8 B....P......2{+.
00a0 - e4 3c 63 e0 ca 62 76 b9-50 ee 62 ee 8c 00 9f e7 . 00b0 - 55 91 28 22 ea 2d b1 b0-fd ee a8 fa 8b b1 ac ed U.(".-..........
00c0 - 6e d7 4e 7a 00 c8 7e 00-58 7f 77 ea b5 b3 0f 55 n.Nz..~.X.w....U
00d0 - 3a 0b 91 13 44 38 c8 69-0a 22 58 16 56 49 d0 c4 :...D8.i."X.VI..
00e0 - 2a b9 7e af be 59 ec 94-a6 ed 11 35 98 05 14 7a *.~..Y.....5...z
00f0 - 77 dc c6 e2 b7 d3 d9 5b-5f f0 0d a3 fd 23 bb 8b w......[_....#..
-----
Start Time: 1742386190
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: D5CCDA6883FC1E98C7D38783C32BAAFB5F3D3E3EEA76B5B213BCDAA9A0CA59A4
Session-ID-ctx:
Resumption PSK: FCD8881749B0D23C7101D772927A91E316452DCFFA6E60BD98E4A6752604D0C18152CD79C25EA05BF140E21CC908F1EC
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 55 67 27 09 e6 ae 0d 6d-4d 46 90 5f 40 aa 1e f0 Ug'....mMF._@...
0010 - b6 aa eb d3 3c 62 e8 8d-4b cb 84 f0 fd 5d 9a 39 .... 0020 - 30 7c 7c 38 21 0b f6 41-bc 05 9f e5 a4 18 6b 5f 0||8!..A......k_
0030 - db b3 3c 85 13 f5 1a b8-27 6f 6c 29 97 07 f6 76 ..<.....'ol)...v
0040 - e0 a3 1b ed 04 9c fe 4b-b3 81 bb 62 9d 00 4c 4d .......K...b..LM
0050 - 94 4e 21 7a 6c 39 04 39-c0 97 0f 53 c5 55 4d 92 .N!zl9.9...S.UM.
0060 - a2 ab 5a bf 8b 41 66 b2-0a b1 5a ef 65 79 ff c0 ..Z..Af...Z.ey..
0070 - 4a f0 87 d5 cd 84 71 92-84 d5 0a 2d 68 b5 f9 25 J.....q....-h..%
0080 - 9d c1 4a 31 18 33 bd aa-22 d5 39 65 c9 6e 98 6d ..J1.3..".9e.n.m
0090 - 6f 89 0d 87 bc 14 3f bf-b4 00 1d a9 2c 50 f4 ad o.....?.....,P..
00a0 - d1 9b ce 5c 64 96 00 dd-7c 12 13 15 58 aa ec da ...\d...|...X...
00b0 - 57 bf 1a ca df 34 ff 71-58 6d cd a0 54 81 d4 69 W....4.qXm..T..i
00c0 - 5b b0 7e c6 12 ed 66 5f-71 77 67 32 bb da 4c d8 [.~...f_qwg2..L.
00d0 - 15 1d 4a 74 36 cb ce 39-14 6f 47 58 d4 bf 78 27 ..Jt6..9.oGX..x'
00e0 - 1d 3c bb 75 0e df f1 71-8e 48 ba 48 6c 10 1f 6c .<.u...q.H.Hl..l
00f0 - 40 a5 dc cd 29 bb 01 e4-f7 4f 0f ee a0 4b ae e4 @...)....O...K..
-----
Start Time: 1742386190
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK

Проверить автоматическое продление:

# certbot renew --dry-run

Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/dinozavr1967.ru.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for dinozavr1967.ru and www.dinozavr1967.ru
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/usr/local/etc/letsencrypt/live/dinozavr1967.ru/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Теперь SSL сертификат установлен и его автоматическое продление активировано.

Но просто получить новый сертификат недостаточно, надо ещё и перезагрузить

веб-сервер Apache, чтобы он начал использовать новый сертификат.

Для этого в специально отведенном каталоге создаем исполняемый скрипт,

который будет запускаться после каждого успешного обновления сертификатов :

# touch /usr/local/etc/letsencrypt/renewal-hooks/deploy/restart_apache.sh

# ee /usr/local/etc/letsencrypt/renewal-hooks/deploy/restart_apache.sh

#!/bin/sh
service apache24 graceful

Даём права :

# chmod +x /usr/local/etc/letsencrypt/renewal-hooks/deploy/restart_apache.sh

Перезагружаем всю систему :

# shutdown -r now

Заходим на сайт :

https://Ваш домен


Яндекс.Метрика Рейтинг@Mail.ru