Apache SSL: ใบรับรองเซิร์ฟเวอร์ไม่รวม ID ที่ตรงกับชื่อเซิร์ฟเวอร์


21

ฉันพยายามตั้งค่า SSL บนเว็บเซิร์ฟเวอร์ apache2 ของฉัน แต่ดูเหมือนว่ามันจะไม่ทำงานเลย

ฉันได้ทำตามบทช่วยสอนเพื่อสร้างไฟล์ใบรับรองด้วย openssl และกำหนดค่า/etc/apache2/sites-available/default-ssl.confอย่างเหมาะสม

ทุกครั้งที่ฉันพยายามเปิดเว็บไซต์ด้วย https เบราว์เซอร์ของฉันปฏิเสธที่จะเชื่อมต่อเนื่องจากปัญหาด้านความปลอดภัย มีข้อความระบุว่าฉันไม่ได้กำหนดค่าเว็บไซต์ของฉันอย่างถูกต้อง

ใน/var/log/apache2/error.logฉันได้รับคำเตือนซึ่งบอกว่าใบรับรองเซิร์ฟเวอร์ของฉันไม่รวม ID ที่ตรงกับชื่อเซิร์ฟเวอร์

[Mon Apr 10 11:03:24.041813 2017] [mpm_prefork:notice] [pid 1222] AH00169: caught SIGTERM, shutting down
[Mon Apr 10 11:03:30.566578 2017] [ssl:warn] [pid 661] AH01909: 127.0.0.1:443:0 server certificate does NOT include an ID which matches the server name
[Mon Apr 10 11:03:31.579088 2017] [ssl:warn] [pid 1194] AH01909: 127.0.0.1:443:0 server certificate does NOT include an ID which matches the server name
[Mon Apr 10 11:03:31.592958 2017] [mpm_prefork:notice] [pid 1194] AH00163: Apache/2.4.25 (Raspbian) OpenSSL/1.0.2k configured -- resuming normal operations
[Mon Apr 10 11:03:31.593136 2017] [core:notice] [pid 1194] AH00094: Command line: '/usr/sbin/apache2'

คุณมีความคิดเห็นเกี่ยวกับวิธีการแก้ไขปัญหานี้หรือไม่? ขอขอบคุณในเรื่อง!


คุณใช้ Apache 2.2 หรือ 2.4 หรือไม่ ฉันอัพเกรดจาก 2.2 เป็น 2.4 และได้รับข้อผิดพลาดนี้ ในกรณีของฉันมันไม่ใช่เซิร์ฟเวอร์สาธารณะมันเป็นเซิร์ฟเวอร์ภายในดังนั้นฉันเดาว่าใบรับรองที่ลงชื่อด้วยตัวเองจะทำ
svhyd

ฉันใช้ Apache 2.2 บนเซิร์ฟเวอร์สาธารณะของฉัน (Debian 8) เมื่อฉันพบข้อผิดพลาดนี้ หลังจากเปลี่ยนเป็น Let's Encript แล้วข้อผิดพลาดก็หายไปดังนั้นฉันเดาว่าเป็นใบรับรองที่ลงนามเองซึ่งทำให้เกิดข้อผิดพลาด
pixelmusic

คำตอบ:


7

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

ฉันได้ทำตามแบบฝึกหัดทีละขั้นตอนเพื่อสร้างการรับรอง SSL สำหรับเว็บเซิร์ฟเวอร์ของฉัน เช่นเดียวกับบทเรียนจำนวนมากผลลัพธ์ของการกวดวิชาที่ฉันติดตามคือใบรับรองแบบลงนามด้วยตนเองโดยใช้ OpenSSL ใช่ลงชื่อตัวเองนั่นเป็นปัญหา เบราว์เซอร์ไม่สามารถเชื่อถือเซิร์ฟเวอร์เนื่องจากเป็นใบรับรองซึ่งลงชื่อด้วยตัวเอง ฉันจะไม่ทำอย่างใดอย่างหนึ่ง ...

ใบรับรองจะต้องมีการลงนามโดยหน่วยงานออกใบรับรองภายนอกที่น่าเชื่อถือ (CA) ดังนั้นฉันจึงเข้าสู่Let's Encryptซึ่งทำงานทั้งหมดให้คุณและง่ายกว่าในการตั้งค่าและที่ดีที่สุดคือมันฟรีอย่างแน่นอน

การติดตั้ง

1) ลบไฟล์ใบรับรอง ssl เก่าที่คุณสร้างโดยใช้ OpenSSL

2) เปิด backport เพื่อรับลูกค้า certbot ใน Debian คุณควรรู้ว่านี่จะเป็นการเปิดรูสำหรับซอฟต์แวร์ที่ยังไม่เสร็จ! ติดตั้งเฉพาะแพ็คเกจเมื่อคุณตระหนักถึงสิ่งที่คุณทำ

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

3) อัพเดทระบบ linux ของคุณ

sudo apt-get update

4) ติดตั้ง certbot

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

5) ตั้งค่า apache ServerName และ ServerAlias

sudo nano /etc/apache2/sites-available/000-default.conf

6) แก้ไขไฟล์ config ของ Apache

<VirtualHost *:80>
    . . .
    ServerName example.com
    ServerAlias www.example.com
    . . .
</VirtualHost>

7) ตรวจสอบไวยากรณ์ที่ถูกต้อง

sudo apache2ctl configtest

8) หากไฟล์ปรับแต่งดูดีให้รีสตาร์ทเซิร์ฟเวอร์ apache

sudo systemctl restart apache2

9) ตั้งค่าใบรับรองโดยใช้ certbot และทำตามคำแนะนำบนหน้าจอ

sudo certbot --apache

การฟื้นฟู

ใบรับรองทั้งหมดโดย Let's Encrypt นั้นมีอายุ 3 เดือน หากต้องการต่ออายุคุณสามารถเรียกใช้ด้วยตนเอง

sudo certbot renew

หรือทำให้บริการนี้เป็นงาน cron โดยอัตโนมัติ

sudo crontab -e

และป้อนแถวต่อไปนี้เพื่อเรียกใช้การต่ออายุทุกวันจันทร์เวลา 2:30 น.

. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

คุณสามารถติดตามการสอนเพิ่มเติมได้ที่นี่: https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-debian-8


สิ่งนี้ไม่สามารถใช้กับ localhost (เครื่องเสมือนบนเครือข่ายท้องถิ่น) ฉันหมายความว่าคุณต้องซื้อโดเมนเพื่อใช้การเข้ารหัสลองใช่มั้ย
lewis4u

1
ใช่เว็บเซิร์ฟเวอร์ของคุณต้องสามารถเข้าถึงได้ผ่านโดเมนที่ลงทะเบียนเพื่อให้เข้ารหัสเพื่อทำงาน
pixelmusic

2

หากคุณไม่เห็นข้อผิดพลาด SSL อื่น ๆ และหากคุณลองตั้งค่า 'LogLevel debug' ในไฟล์ httpd.conf ข้อความแสดงข้อผิดพลาดนี้ยังสามารถแนะนำ 'Listen 443' หายไปจากไฟล์ httpd.conf


ฉันลืมที่จะให้ Apache ฟัง 443 ทั้งหมดเพียงฟัง 80 ขอบคุณ
Robert

1

นั่นไม่ใช่ข้อผิดพลาด - เป็นคำเตือน ค่อนข้างเป็นไปได้ที่จะรัน mod_ssl ด้วยใบรับรองที่ไม่ตรงกับชื่อเซิร์ฟเวอร์ที่กำหนดไว้ตราบใดที่คุณมีโฮสต์ ssl เริ่มต้นที่กำหนดไว้และชื่อทั่วไปบนใบรับรองตรงกับชื่อโฮสต์ที่ไคลเอ็นต์ใช้เชื่อมต่อ

หลังไม่ปรากฏว่าเป็นจริงในกรณีของคุณ จาค็อบกล่าวว่าคุณจะต้องระบุชื่อโฮสต์ที่ถูกต้องเป็นชื่อสามัญ (หรือนามแฝง) เมื่อคุณสร้างความรับผิดชอบต่อสังคม

หากต้องการดูว่ามีชื่ออะไรในใบรับรองปัจจุบัน:

openssl s_client -showcerts -connect ${HOSTNAME}:443

หากมีใบรับรองจำนวนมากติดตั้งบนเครื่องและแสดงผลในที่อยู่ IP เดียวกันให้ทำดังนี้:

openssl s_client -showcerts -connect ${HOSTIP}:443 -servername ${HOSTNAME}

(โดยที่ค่า $ {... } เป็นตัวยึดตำแหน่งคุณควรแทนที่ด้วยค่าที่เกี่ยวข้อง)


(1) คุณควรใส่ชื่อเซิร์ฟเวอร์ใน CommonName ใน CSR แต่ไม่ว่าจะเป็นจริงหรือไม่ (ตรวจสอบว่า CA ตรวจสอบและ / หรือคัดลอก) ขึ้นอยู่กับ CA (2) openssl s_clientแสดงหัวเรื่องและผู้ออกใบ leaf ซึ่งเป็นเพียงคนเดียว คุณต้องการที่นี่โดยไม่มี-showcertsแต่สำหรับ certs ของจริงตั้งแต่ปี 2010 (และ certs DIY โดยบุคคลที่มีความสามารถ ) สิ่งที่คุณต้องดูไม่ใช่หัวข้อ แต่ส่วนขยาย SubjectAltName (SAN) และเพื่อที่คุณต้องการopenssl s_client -connect h:p [-servername h] | openssl x509 -noout -text
dave_thompson_085

โปรดทราบว่าตั้งแต่กลางปี ​​2018 คุณจะต้องระบุชื่อ DNS ในชื่อสำรองของหัวเรื่องด้วยเช่นกันหากคุณต้องการให้ใบรับรองของคุณได้รับการตรวจสอบความถูกต้องในเบราว์เซอร์สมัยใหม่
symcbean

ฉันไม่รู้การเปลี่ยนแปลงใด ๆ ในปี 2561 Chrome จำเป็นต้องมี SAN (ทั้ง DNS หรือ IP แม้ภายหลังจะไม่ค่อยได้ใช้) ตั้งแต่ต้นปี 2017 และ Firefox และ IE (ซึ่งผมยังคงพิจารณาที่ทันสมัย) ไม่จำเป็นต้องใช้มันในวันนี้ - แม้ว่าขณะที่ผมกล่าวว่าก่อนหน้านี้ประชาชนCAsได้ให้ มันอีกต่อไป
dave_thompson_085

0

ฉันพบปัญหานี้เมื่อเร็ว ๆ นี้เมื่อใบรับรองที่ลงชื่อด้วยตนเองหมดอายุแล้ว ฉัน googled และเพิ่งคัดลอกคำสั่งสำหรับสร้างใบรับรองใหม่จากเว็บไซต์หนึ่ง

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/apache2/ssl/apache.crt

ในไฟล์ config apache ของฉัน: /etc/apache2/sites-available/default-ssl.conf ไฟล์ใบรับรองและไฟล์คีย์อ้างถึงชื่อไฟล์ต่อไปนี้

    SSLCertificateFile  /etc/apache2/ssl/apache.crt
    SSLCertificateKeyFile /etc/apache2/ssl/apache.key

ดังนั้นข้อผิดพลาดที่เห็นที่นี่ในกรณีของฉันคือการแก้ไขง่ายขึ้นเพียงแค่ให้ตำแหน่งที่ถูกต้องของไฟล์คีย์ใบรับรองเมื่อสร้างใบรับรอง SSL

ดังนั้นนี่คือคำสั่งที่ฉันควรใช้ & พิมพ์อย่างถูกต้อง

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

0

ในกรณีของฉันฉันได้แก้ไขโดยแทนที่ในไฟล์ apache ssl config ของฉันสำหรับแต่ละโดเมนที่เกี่ยวข้อง:

ServerName mydomain.com
ServerAlias www.mydomain.com

โดย:

ServerName www.mydomain.com
ServerAlias mydomain.com

เพราะใบรับรองของฉันมีไว้สำหรับ "www.mydomain.com" และไม่ใช่สำหรับ "mydomain.com"

ไฟล์ apache สมบูรณ์:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin noreply@mydomain.com
        ServerName www.mydomain.com
        ServerAlias mydomain.com
    DocumentRoot /home/mydomain.com/public_html
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|ico|png)$ \ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ \no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    <Directory />
        Options +FollowSymLinks
        AllowOverride All
    </Directory>
    <Directory /home/mydomain.com/public_html>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride All
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>


ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn
SSLCertificateFile /etc/letsencrypt/live/www.mydomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mydomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

0

เราต้องเพิ่ม ServerName และ ServerAlias ​​ไปยังไฟล์ default-ssl ไม่ใช่แค่ไฟล์ conf สำหรับโดเมนเฉพาะ
สิ่งนี้กำจัดข้อผิดพลาดที่น่ารำคาญสำหรับเรา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.