Rantai sertifikat Apache tidak sedang dikirim

2

Selamat siang!

Saya telah mencari google tinggi dan rendah. Ya ampun, saya belum pernah melewati halaman 2 dari hasil pencarian sebelumnya! Tapi yang satu ini membuatku bingung.

Saya memiliki situs web yang saya amankan dengan sertifikat yang ditandatangani oleh sertifikat perantara, ditandatangani oleh sertifikat CA yang ditandatangani sendiri. Setiap situs web stackexchange q / a, dll tampaknya menunjukkan yang berikut:

  1. Gabungkan sertifikat server Anda dengan sertifikat perantara, lalu dengan sertifikat CA Anda. (mis. cat apache.pem & gt; chain_file; intermediary.pem kucing & gt; & gt; chain_file; cat ca.pem & gt; & gt; chain_file)
  2. Arahkan ke file baru ini pada konfigurasi apache ssl Anda menggunakan SSLCertificateFile karena SSLCertificateChainFile sedang tidak digunakan lagi.
  3. Periksa dengan browser (atau ssllabs.com atau sslshopper.com) untuk melihat apakah sertifikat sedang diekspor.

Namun, ketika saya memeriksa dengan browser, saya hanya melihat sertifikat server dan tidak mengandung sertifikat perantara atau CA. Hal yang sama dikonfirmasi dengan ssllab dan sslshopper.

Apakah ada opsi yang saya lewatkan yang memastikan bahwa Anda menerbitkan seluruh rantai dan bukan hanya sertifikat server?

Terima kasih

scuba_mike
sumber
Anda tidak bisa melihatnya di browser Anda. Apakah Anda mencoba salah satu situs yang ditunjukkan?
Daniel B
Instruksi terlihat baik-baik saja. Pastikan sertifikatnya diri meskipun benar. (Mungkin sertifikat Anda dikeluarkan oleh perantara berbeda dari yang Anda coba bundel?) Coba juga ssl-tools.net untuk memeriksa rantai.
grawity
DanielB, ya. Hal yang sama telah dikonfirmasi oleh grawity ssllabs.com dan sslshopper.com, itu juga merupakan pemikiran saya, tetapi saya telah memeriksa Subjek dan Penerbit.
scuba_mike
Selain itu, saya menjalankan perintah berikut: openssl verify -CAfile ca.pem -untrusted intermediary.pem apache.pem dan ini mengembalikan OK.
scuba_mike
Itu tidak menguji konfigurasi server Anda dengan cara apa pun. Karena Anda memiliki OpenSSL yang tersedia, segalanya cukup mudah. Saya akan segera menulis jawaban.
Daniel B

Jawaban:

2

Jika Anda memiliki OpenSSL yang Anda inginkan, memverifikasi ini sangat mudah:

cat /dev/null | openssl s_client -showcerts -servername example.com -connect example.com:443

Saya akan menjelaskan komponennya:

  • cat /dev/null: openssl s_client bekerja sangat mirip telnet. Itu membuat koneksi dan Anda kemudian dapat berinteraksi dengannya. Kapan openssl bertemu EOF di aliran input, koneksi ditutup. cat /dev/null segera menghasilkan EOF. Atau, Anda dapat menggunakan Ctrl D untuk mengeluarkan EOF di terminal.
  • openssl s_client: "Program klien SSL / TLS"
  • -showcerts: Tampilkan gumpalan sertifikat dalam format PEM. Sebaliknya hanya menampilkan sertifikat server.
  • -servername example.com: Tetapkan nama server untuk SNI . Diperlukan saat melakukan vhost berbasis nama HTTPS.
  • -connect example.com:443: Terhubung ke example.com di pelabuhan 443, port HTTPS standar.

Ini menghasilkan sesuatu seperti itu:

$ cat /dev/null | openssl s_client -showcerts -servername inbox.google.com -connect inbox.google.com:443
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = mail.google.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
snip
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3767 bytes and written 469 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 1B47CE2ADB10CE410C8048C3AAEF7CEF1B2B76C6D2DF5EDE78FE015A6DA44207
    Session-ID-ctx:
    Master-Key: E9AE458F6D72D507F422DA2340C7345AC6EDB087278E62A5FDA754897EC6BDF5C336AFBF6B88554E358C675A3545B724
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 100800 (seconds)
    TLS session ticket:
    snip

    Start Time: 1460049698
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

Saya menggunakan domain Google di sini karena memiliki rantai sertifikat yang lebih dalam daripada example.com. Sertifikat di sini memiliki "Nama Alternatif Perihal" dan karenanya juga berlaku untuk inbox.google.com.

Server yang dikonfigurasi secara tidak benar akan melewati sertifikat perantara, yang disebut "Google Internet Authority G2" di sini. Sertifikat Equifax agak berlebihan karena GeoTrust adalah CA mapan yang langsung dipercaya di peramban Anda.

Daniel B
sumber
Terima kasih atas catatannya. Saya tidak mengetahui opsi servername. Itu tidak ada di halaman manual. Bagaimanapun, menjalankannya memberi saya "gethostbyname failure connect: errno = 0" Perbedaan antara Google dan saya adalah bahwa google menggunakan CN eksplisit (mis. Mail.google.com) dan saya menggunakan sertifikat wildcard. Apakah saya perlu memiliki sertifikat server eksplisit?
scuba_mike
Tidak. Kesalahan yang Anda dapatkan menunjukkan host tujuan ( -connect argumen) tidak dapat diselesaikan. Ini sepenuhnya tidak terkait dengan TLS, sertifikat dan yang lainnya. Apakah Anda yakin tidak memiliki kesalahan ketik pada baris perintah?
Daniel B
Hmm ... Saya tidak punya kesalahan ketik sebelumnya tetapi tampaknya berfungsi sekarang (s_client). Ini menunjukkan 3 sertifikat tetapi mereka memiliki kedalaman 0 dan informasi sertifikat yang sama, dalam hal ini sertifikat untuk server. Tetapi setiap baris memiliki kesalahan. Kesalahan pertama: verify error:num=20:unable to get local issuer certificate'. Second error: verifikasi kesalahan: num = 27: sertifikat tidak dipercaya` Kesalahan ketiga: verify error:num=21:unable to verify the first certificate Jika Anda ingin mencoba, silakan: aws.mikesoh.com
scuba_mike
Ya, saya menemukan kesalahan Anda. Ini kasus RTFM yang lain. ;) Anda memiliki Apache 2.4.7, tetapi versi baru dari SSLCertificateFile petunjuk yang mendukung sertifikat perantara (atau, lebih umum: banyak) hanya tersedia mulai dari 2.4.8.
Daniel B
FRAK! Ok sekarang apache tidak akan mulai. Ini memberi saya kesalahan X509_check_private_key:key values mismatch. memeriksa web untuk ini sekarang ...
scuba_mike
0

Terima kasih kepada Daniel B. Masalahnya ada dua:

  1. Saya menjalankan versi apache yang agak lama. Saya sangat merindukan ini.
  2. Setelah itu saya mengubah kembali konfigurasi yang digunakan SSLCertificateChainFile sebagai gantinya, saya masih mengalami masalah menggunakan openssl s_client.

Ternyata untuk nomor 2, saya harus batalkan komentar pada garis.

Terimakasih semuanya!

scuba_mike
sumber