ฉันมีบางไซต์ที่ทำงานด้วยใบรับรองฟรีของ StartSSL ( CJSHayward.com , JobhuntTracker.com ) และ Firefox ปฏิเสธ StartSSL และแสดงหน้าข้อผิดพลาดโดยแจ้งว่าเซิร์ฟเวอร์ของฉันไม่ได้รับการกำหนดค่าอย่างเหมาะสม (IIRC) เนื่องจากสายใบรับรอง ฉันขอความช่วยเหลือและยืนยันว่า VirtualHost ของฉัน (ตามคำขอ) มีไว้สำหรับสายใบรับรอง และฉันได้ติดตั้งใบรับรองระดับกลางอย่างถูกต้อง ไซต์แสดงโดยไม่มีข้อผิดพลาดที่ฉันทราบใน Chrome, Safari, Edge หรือ Opera

หลังจากทำการค้นหาแล้วLet's Encrypt!ดูเหมือนข้อเสนอที่น่าดึงดูดใจ และไม่นานเกินไปฉันก็มี (AFAICT) คีย์ส่วนตัวและใบรับรองสำหรับแต่ละโดเมนภายใต้ /etc/apache2/sites-enabled (AFAICT) นานเกินไป ลบด้วยโดเมนที่ไม่ใช่ของฉันอีกต่อไป ฉันคิดว่าฉันทำทดลองใช้และทำให้การเชื่อมต่อ HTTPS ไปยังเว็บไซต์ขณะนี้สามารถใช้ได้เฉพาะภายใต้ http: JSH.nameฉันย้าย "มาเข้ารหัสกันเถอะ!" ใบรับรองและคีย์ส่วนตัวไปยังไดเรกทอรี SSL ของฉันและเพิ่ม:

<VirtualHost *:443>
        ServerAdmin [email protected]
        DocumentRoot /home/jonathan/stornge
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/0000_csr-letsencrypt.pem
        SSLCertificateKeyFile /etc/apache2/ssl/0000_key-letsencrypt.pem
        ServerName jsh.name
        ServerAlias www.jsh.name
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
        CustomLog /home/jonathan/logs/stornge.com combined
        <Directory /home/jonathan/stornge/>
            Options ExecCGI Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
        </Directory>
</VirtualHost>

จากนั้นฉันก็รีบูทเพื่อดูงานของฉัน และทุกคำขอ HTTP หรือ HTTPS ที่ฉันทำก็แค่หยุดทำงาน ซึ่งรวมถึงสองโดเมนบน HTTPS ที่มีใบรับรอง StartSSL ของฉัน และโดเมนที่น่าจะพร้อมใช้งานใหม่บน HTTPS ที่เข้าถึงผ่านทั้ง HTTP และ HTTPS ฉันแสดงความคิดเห็นกับ VirtualHost และตีกลับ Apache และฟังก์ชันเก่าทั้งหมดกลับมาใช้งานได้ตามปกติ

ฉันเคยใช้ Let's "เข้ารหัส!" ถูกต้องหรือไม่ ฉันสงสัยเล็กน้อยเนื่องจากการกำหนดค่า SSL ที่มีอยู่มีคีย์ส่วนตัวที่มีนามสกุล .key นามสกุลใบรับรอง .crt และไฟล์ลูกโซ่ใบรับรองที่มีนามสกุล .pem

ฉันลองอีกครั้งหลังจากตรวจสอบไดเรกทอรี SSL และพบว่า 0000_csr.letsencrypt.pem เป็นโหมด 644 ฉันเปลี่ยนไฟล์ทั้งหมดในไดเร็กทอรีนั้นเป็นโหมด 600 เมื่อฉันพยายามสักครู่ที่ผ่านมา ฉันได้พฤติกรรมแบบเก่าซ้ำแล้วซ้ำเล่า: เว็บไซต์หยุดทำงานตามคำขอทั้งหมด และapachectl restartได้รับคำสั่ง (ฉันลืมถ้อยคำที่แน่นอน) ว่า httpd ไม่ทำงานและคอมพิวเตอร์กำลังพยายามเริ่มต้น

ฉันจะรับใบรับรองการทำงานฟรีสำหรับ "Let's Encrypt" หรือเครื่องมืออื่นๆ ที่ไม่ได้ทำให้ Firefox แปลกแยกได้อย่างไร

apachectl -vให้:

Server version: Apache/2.4.10 (Debian)
Server built:   Nov 28 2015 14:05:48

uname -aให้:

Linux www 4.4.0-x86_64-linode63 #2 SMP Tue Jan 19 12:43:53 EST 2016 x86_64 GNU/Linux

--อัปเดต--

เนื้อหาที่ถูกลบ 0000_key-letsencrypt.pem ถูกล้อมรอบด้วย:

-----BEGIN PRIVATE KEY----- -----END PRIVATE KEY-----

การค้นหาในลำดับชั้นของไดเร็กทอรีให้ผลตอบแทน:

[email protected]:/etc/letsencrypt# find `pwd` -print
/etc/letsencrypt
/etc/letsencrypt/keys
/etc/letsencrypt/keys/0000_key-letsencrypt.pem
/etc/letsencrypt/accounts
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/private_key.json
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/meta.json
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/1ef8dc9b994b9b68a4e9c7cedd003be3/regr.json
/etc/letsencrypt/renewal
/etc/letsencrypt/options-ssl-apache.conf
/etc/letsencrypt/csr
/etc/letsencrypt/csr/0000_csr-letsencrypt.pem

ไดเร็กทอรี /home/jonathan/stornge และเนื้อหานั้นสามารถอ่านได้ทั่วโลกและเรียกใช้งานได้ทั่วโลกซึ่งจะสร้างความแตกต่าง

--อัปเดต--

เพิ่มสิ่งที่สำคัญที่นี่:

http://OrthodoxChurchFathers.com Apache ไฟล์ conf มีสอง VirtualHosts หนึ่งให้บริการขึ้นhttp://OrthodoxChurchFathers.comและหนึ่งที่จะเปลี่ยนเส้นทางhttp://www.OrthodoxChurchFathers.comการร้องขอไปยังhttp://OrthodoxChurchFathers.com ไฟล์ .conf ที่มีทั้ง VirtualHosts คือ:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName orthodoxchurchfathers.com
    #ServerAlias www.orthodoxchurchfathers.com fathers.jonathanscorner.com

DocumentRoot /home/cjsh/fathers/document_root
&lt;Directory />
    Options FollowSymLinks
    AllowOverride None
&lt;/Directory>
&lt;Directory /home/cjsh/fathers>
    Options ExecCGI FollowSymLinks Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
&lt;/Directory>

DirectoryIndex index.cgi index.html

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
&lt;Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
&lt;/Directory>

</VirtualHost>

&lt;VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.orthodoxchurchfathers.com
ServerAlias fathers.jonathanscorner.com
DocumentRoot /home/cjsh/oldmirror
RewriteEngine On
RewriteRule ^(.*)$ http://orthodoxchurchfathers.com$1 [R=301,L]
&lt;/VirtualHost></pre></code>

When I try to run it and request orthodoxchurchfathers.com alone, I get:

┌──────────────────────────────────────────────────────────────────────┐ │ We were unable to find a vhost with a ServerName or Address of │ │ orthodoxchurchfathers.com. │ │ Which virtual host would you like to choose? │ │ (note: conf files with multiple vhosts are not yet supported) │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │1 008-stornge.conf | Multiple Names | │ │ │ │2 014-paraskeva.conf | paraskeva.jonathansco | │ │ │ │3 036-unixytalk.conf | unixtalk.jsh.name | │ │ │ │4 038-proxy.conf | Multiple Names | │ │ │ │5 027-anna.conf | Multiple Names | │ │ │ │6 044-jobhunt-tracker.creation.c | Multiple Names | │ │ │ │7 049-jsh.conf | Multiple Names | │ │ │ │8 001-steampunk.conf | | │ │ │ │9 006-blajeny.conf | Multiple Names | │ │ │ │10 032-videos.conf | Multiple Names | d│ │ │ └────↓(+)──────────────────────────────────────────────────30%─────┘ │ ├──────────────────────────────────────────────────────────────────────┤ │ │ └──────────────────────────────────────────────────────────────────────┘

คำสั่งที่ฉันใช้คือ ./letsencrypt-auto --debug certonly

answer

ฉันได้เขียนคู่ของวิธีการชำระเงินสำหรับการทำงาน Let 's ใบรับรองการเข้ารหัส SSL บน CentOS: ตั้งค่าเริ่มต้นและcronning มัน

และต่อโดเมนของฉัน (ฉันใช้หลักการตั้งชื่อไฟล์ของz-<[sub-]domain-tld>.conf) ไฟล์กำหนดค่า Apache มีลักษณะดังนี้:

<VirtualHost *:80>
ServerName domain.tld
Redirect permanent / https://domain.tld/
</VirtualHost>

<VirtualHost *:443>
    SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/domain.tld/fullchain.pem
    DocumentRoot /var/www/domain
    ServerName domain.tld
    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    ServerAdmin [email protected]

    SSLEngine on

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

    <Directory "/var/www/domain">
         Options All +Indexes +FollowSymLinks
         AllowOverride All
         Order allow,deny
         Allow from all
    </Directory>

</VirtualHost>

และ ssl.conf ของฉันมีลักษณะดังนี้:

#SSL options for all sites
Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
Mutex sysvsem default
SSLRandomSeed startup file:/dev/urandom  1024
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLCompression          off
SSLHonorCipherOrder     on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256

การใช้ Let's Encrypt เพื่อรับใบรับรอง SSL (และทำให้ไซต์ของคุณได้รับคะแนน "A" จากSSL Labs ) ค่อนข้างตรงไปตรงมา - เมื่อคุณผ่านส่วนโค้งบางส่วนของ Apache configs และอาร์กิวเมนต์บรรทัดคำสั่ง LE แล้ว

ฉันพบว่าไคลเอ็นต์ACMEทำงานได้ดี ตั้งค่าและใช้งานได้ง่าย อัปเดตเป็นประจำและอัปเดตได้ง่าย และทำงานได้ดีบน Amazon Linux ผมเคยเขียนกวดวิชาในนั้นที่คุณสามารถหาได้ที่นี่

เริ่มต้นด้วยการดาวน์โหลด ACME และตั้งค่า

https://github.com/hlandau/acme.git
cp ./acmetool /usr/local/bin
/usr/local/bin/acmetool quickstart

ขอใบรับรอง

./acmetool want example.com www.example.com

นี่คือวิธีที่ฉันตั้งค่าไดเร็กทอรีสำหรับความท้าทาย - นี่คือที่ที่ Let's Encrypt เชื่อมต่อกับเซิร์ฟเวอร์ของคุณเพื่อตรวจสอบ

mkdir -p /var/www/acme-challenge/.well-known/acme-challenge
chmod -R user:www-data /var/www/acme-challenge/*
find /var/www/acme-challenge/ -type d -exec chmod 755 {} \;
vi /var/www/acme-challenge/.well-known/acme-challenge/text.html   (add "hello world!" or similar)

มีรายละเอียดและคำอธิบายเพิ่มเติมในเว็บไซต์ที่เชื่อมโยงด้านบน และผู้เขียนและชุมชนมีประโยชน์

ฉันประสบความสำเร็จในการใช้Certbotของ EFF ในโหมดรูทของเว็บ (เพราะแนวคิดของกระบวนการอัตโนมัติที่หยุดเว็บเซิร์ฟเวอร์ แม้ว่าจะเพียงช่วงสั้นๆ ระหว่างการต่ออายุใบรับรองทำให้ฉันกลัว)

ขั้นแรก ติดตั้ง Certbot หากคุณใช้ Debian Jessie (ซึ่งเป็นปัจจุบันในขณะที่ฉันเขียนสิ่งนี้) ให้เพิ่มที่jessie-backportsเก็บก่อน

$ sudo apt-get install python-certbot-apache -t jessie-backports

สิ่งนี้จะนำมาซึ่งแพ็คเกจจำนวนหนึ่งรวมถึง certbot เอง

จากนั้น ในการสร้างใบรับรองในโหมดwebrootให้เรียกใช้บางอย่างเช่น

$ sudo certbot certonly --webroot -w /srv/www/www.example.net/htdocs -d www.example.net

คุณสามารถเพิ่ม--register-unsafely-without-emailและ--rsa-key-size Xถ้าคุณต้องการขนาดโมดูลัสอื่นที่ไม่ใช่ค่าเริ่มต้น (ซึ่งปัจจุบันคือ 2048 บิต) -d fqdn.example.comสามารถทำซ้ำได้หลายครั้งตามต้องการ-w; แต่ละรายการจะ-wเริ่มต้นชุดโดเมนใหม่ที่ให้บริการจากไดเร็กทอรี โดเมนที่ตั้งชื่อโดย-d. Let's Encrypt ไม่ได้ออกใบรับรองไวด์การ์ด (มีการกล่าวถึงในคำถามที่พบบ่อย) และเห็นได้ชัดว่าไม่ใช่ใบรับรองสำหรับชื่อโดเมน Punycode

ผู้ใช้ที่certbotทำงานตามความต้องการ อย่างน้อยที่สุดและโดยค่าเริ่มต้น การเข้าถึงเพื่อเขียนในหลายๆ ที่ภายใต้/etc/letsencrypt. มันอาจจะง่ายที่สุดที่จะเรียกใช้ในฐานะรูท มันจะสร้างไฟล์ภาย.well-known/acme-challengeใต้ไดเร็กทอรีรูทเว็บที่กำหนด ( -w) ให้ระบบรีโมตตรวจสอบว่าสามารถเข้าถึงได้ผ่านชื่อโดเมนที่ระบุผ่าน HTTPและหากทุกอย่างที่เช็คเอาท์จะสร้างไฟล์ PEM จำนวนมาก/etc/letsencrypt/archive/www.example.netพร้อมชุดสัญลักษณ์ที่เกี่ยวข้อง เชื่อมโยง/etc/letsencrypt/live/www.example.netและพิมพ์ข้อความแสดงความสำเร็จที่เป็นมิตร

หากทุกอย่างเรียบร้อย สิ่งที่คุณต้องทำคือตั้งค่าเว็บเซิร์ฟเวอร์ให้ใช้ใบรับรองที่พบในไดเรกทอรีย่อยชื่อโฮสต์ของ/etc/letsencrypt/liveHTTPS สำหรับโดเมนที่เป็นปัญหา ขั้นต่ำสุดที่แน่นอนสำหรับสิ่งนี้สำหรับ Apache เป็นสิ่งที่คล้ายกับ:

<VirtualHost *:443>
        ServerName www.example.net
        SSLEngine on
        SSLCertificateKeyFile /etc/letsencrypt/live/www.example.net/privkey.pem
        SSLCertificateFile /etc/letsencrypt/live/www.example.net/cert.pem
        SSLCertificateChainFile /etc/letsencrypt/live/www.example.net/chain.pem
</VirtualHost>

เพิ่มคำสั่งอื่นๆ ตามต้องการ ยืนยันการใช้apache2ctl -Sและapache2ctl configtestตรวจสอบว่าทุกอย่างเช็คเอาท์ และเปิดใช้งานโฮสต์เสมือน HTTPS ด้วยapache2ctl graceful.

อย่าลืมต่ออายุใบรับรองเป็นประจำ ปัจจุบัน Let's Encrypt ใบรับรองจะหมดอายุหลังจาก 90 วัน แพ็คเกจ Debian มาพร้อมกับงาน cron /etc/cron.d/certbotและบริการ systemd /lib/systemd/system/certbot.serviceที่ดูแลเรื่องนี้ หรือคุณสามารถเรียกใช้certbot renewด้วยตนเอง อย่าลืมapache2ctl gracefulเริ่มใช้ใบรับรองที่ออกใหม่ คุณอาจต้องการปรับงาน cron หรือบริการ systemd เพื่อทำสิ่งนี้โดยอัตโนมัติ หากต้องการโหลดใบรับรองที่ต่ออายุโดยอัตโนมัติลงใน Apache บน Debian Jessie ให้พิจารณาอัปเดต/lib/systemd/system/certbot.serviceเพื่อเพิ่มใน[Service]ส่วน (หมายเหตุ: ลำดับมีความสำคัญ):

ExecStartPost=/usr/sbin/apache2ctl configtest
ExecStartPost=/usr/sbin/apache2ctl graceful

การทำเช่นนั้นจะโหลดใบรับรองที่ต่ออายุโดยอัตโนมัติหากไฟล์การกำหนดค่า Apache ผ่านconfigtestและแสดง Certbot เป็นหน่วยที่ล้มเหลวหากไฟล์นั้นconfigtestหรือgracefulล้มเหลว