Server HTTPS lokal dengan SNI

Ada banyak sekali informasi yang tersedia tentang cURL dan SSL, tetapi tidak banyak informasi yang tersedia tentang penulisan server. Saya memiliki server lokal kecil yang ditulis dalam PHP yang saya ingin TLS/SSL diaktifkan. Saya mengalami masalah dengan server saya yang mogok saat koneksi aman. Saya hanya menerima pesan kesalahan, "Peringatan PHP: stream_socket_accept(): Gagal mengaktifkan kripto". Saya memiliki server identik yang berjalan tanpa TLS, dan berfungsi dengan baik. Saya tahu itu adalah sertifikat, atau koneksi ke/membaca sertifikat. Namun, saya tidak yakin apakah ini kesalahan dalam cara saya membuat sertifikat, cara menggabungkannya ke PEM, atau hal lainnya. Selain itu, untuk domain kami, saya telah menggunakan *.domain.tld pada kode di bawah ini, serta nama lokal dalam pembuatan sertifikat.

Selain itu, sertifikat yang ditampilkan di browser web menunjukkan sertifikat 127.0.0.1 dan bukan sertifikat localhost (atau domain lain) terlepas dari domain yang diminta. Apakah itu karena 127.0.0.1 disetel sebagai sertifikat lokal? Tentang sertifikat- ini adalah kode saya saat ini untuk membuat file .pem untuk digunakan di server:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout apache.key -out apache.crt

apache.crt apache.key > joined.pem

Terjemahan dasar kode server adalah:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;

$ctx = stream_context_create(['ssl' => [
    'local_cert' => "{path}/Websites/127.0.0.1/certs/joined.pem",
    'SNI_server_certs' => [
        "127.0.0.1" => "{path}/Websites/127.0.0.1/certs/joined.pem",
        "localhost" => "{path}//Websites/localhost/certs/joined.pem",
    ]
]]);
stream_context_set_option($ctx, 'ssl', 'ssl_method', 'STREAM_CRYPTO_METHOD_TLSv23_SERVER');
stream_context_set_option($ctx, 'ssl', 'allow_self_signed', true);
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'ciphers', "HIGH");


$socket = stream_socket_server("tls://127.0.0.1:8443", $errno, $errstr, $flags, $ctx);


while ( $client = stream_socket_accept($socket, "-1", $clientIP)):

    $msg = fread($client, 8192);

    $resp = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>Hi, you are secured.<br>{$msg}";
    fwrite($client,$resp );
    fclose($client);        

endwhile;

Satu hal lagi, sandi apa yang tepat untuk disetel untuk memenuhi tuntutan semua browser utama di luar sana, Chrome tampaknya bermain dengan aturannya sendiri.

Adakah ide apa yang saya lewatkan di sini?


person Keith Kirkland    schedule 27.04.2018    source sumber
comment
(1) Perintah kedua Anda tampaknya tidak memiliki kucing (meong?) (2) Anda mengatakan Anda menggunakan '*.domain.tld' tetapi kode Anda yang tampaknya rusak menggunakan 'localhost' dan '127.0.0.1' -- ini bisa setara untuk beberapa protokol tetapi TIDAK SAMA SEKALI sama untuk TLS/HTTPS (3) Anda tidak mengatakan jika/bagaimana Anda menyetel ekstensi SubjectAltNames (SAN), yang harus ada di file konfigurasi bukan di baris perintah (kecuali Anda menggunakan shell dengan substitusi proses); saat ini Chrome, tetapi tidak pada browser besar lainnya, menolak sertifikat yang tidak memiliki SAN. (Ini tidak ada hubungannya dengan sandi dan Chrome menerima sandi yang sama seperti yang lain.)   -  person dave_thompson_085    schedule 27.04.2018
comment
Terima kasih balasannya. Saya melihat formatnya sedikit bergeser pada salinan dan tempel saya. Saya juga tidak menyertakan cat pada pembuatan file pem. Bisakah Anda memperluas lebih lanjut tentang SAN? Saya pikir Anda sedang melakukan sesuatu di sana....   -  person Keith Kirkland    schedule 27.04.2018
comment
Terima kasih @dave_thompson_085 masalahnya adalah SAN tidak disetel dengan benar. Tautan serverfault.com/questions/880804/ memperbaiki masalah saya. Tidak bisa melakukannya tanpamu!   -  person Keith Kirkland    schedule 01.05.2018


Jawaban (1)


Masalah saya adalah tidak menyetel SAN selama pembuatan sertifikat. Tautan https://serverfault.com/questions/880804/can-not-get-rid-of-neterr-cert-common-name-invalid-error-in-chrome-with-self memperbaiki masalah saya.

person Keith Kirkland    schedule 01.05.2018