仙石浩明の日記

2007年6月25日

stone に Server Name Indication (TLS 拡張) 機能を実装 hatena_b


RFC 3546  TLS (Transport Layer Security  SSL)  Server Name Indication ( 20036)

 WWW  http Host: IP 使

 () https 使 WWW  SSL  http Host:  WWW

 (WWW)  SSL 
クライアント サーバ
ClientHello 乱数, セッションID, 暗号/圧縮方式
ServerHello 乱数, セッションID, 暗号/圧縮方式決定
Certificate サーバ証明書
ServerKeyExchange 共通鍵の交換
(CertificateRequest クライアント認証を要求する時のみ)
ServerHelloDone ServerHello の終了を通知
(ClientCertificate クライアント認証を要求された時のみ)
ClientKeyExchange 共通鍵の交換
ChangeCipherSpec 次のデータから暗号化することを通知
Finished 以上のハンドシェークのハッシュ値(暗文)
ChangeCipherSpec 次のデータから暗号化することを通知
Finished 以上のハンドシェークのハッシュ値(暗文)

 http 

https  https  (3)  ClientHello Server Name Indication

 Server Name Indication (SNI)  stone  (stone.c Revision 2.3.1.11 )  stone  OpenSSL  SNI  0.9.9  (: 0.9.8f )  OpenSSL 0.9.9 使 stone  make  

 http  senri.gcd.org  asao.gcd.org   stone :
stone -z sni \
      -z servername=senri.gcd.org \
          -z cert=senri.gcd.org-cert.pem \
          -z key=senri.gcd.org-key.pem \
          senri.gcd.org:http 443/ssl -- \
      -z servername=asao.gcd.org \
          -z cert=asao.gcd.org-cert.pem \
          -z key=asao.gcd.org-key.pem \
          asao.gcd.org:http 443/ssl

443/ssl

senri.gcd.org:http 443/ssl -z servername=senri.gcd.org  senri.gcd.org   ( stone)  -z cert=-z key= SSL  senri.gcd.org:http 

asao.gcd.org:http 443/ssl  asao.gcd.org  stone  asao.gcd.org  SSL  asao.gcd.org:http 

 http   http 

OpenSSL 0.9.9  s_client  (SSL )  senri.gcd.org  (-servername senri.gcd.org )
% openssl s_client -connect localhost:443 -servername senri.gcd.org -CApath /usr/local/ssl/certs
CONNECTED(00000003)
depth=2 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org
verify return:1
depth=1 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org
verify return:1
depth=0 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=senri.gcd.org/emailAddress=sengoku@gcd.org
verify return:1
Server did acknowledge servername extension.

 (stone) CN=senri.gcd.org  443  asao.gcd.org 
% openssl s_client -connect localhost:443 -servername asao.gcd.org -CApath /usr/local/ssl/certs
CONNECTED(00000003)
depth=2 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org
verify return:1
depth=1 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org
verify return:1
depth=0 /C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=asao.gcd.org/emailAddress=sengoku@gcd.org
verify return:1
Server did acknowledge servername extension.

CN=asao.gcd.org stone  asao.gcd.org:http  IP  SSL 

 stone  () 
stone -z sni \
      -z certpat=%n-cert.pem \
      -z keypat=%n-key.pem \
      -z servername=senri.gcd.org \
          senri.gcd.org:http 443/ssl -- \
      -z servername=asao.gcd.org \
          asao.gcd.org:http 443/ssl

-z certpat=%n-cert.pem %n -z servername=senri.gcd.org -z cert=senri.gcd.org-cert.pem -z keypat=%n-key.pem

 SNI  WWW  Firefox 2.0  IE7   WWW SNI   https 

Name Based SSL調
IE7RFC3546 Server Name Indication
ApacheRFC3546mod_gnutls
mod_gnutls
2005
でびぞー徒然日記から引用

OpenSSL 0.9.9 の安定版がリリースされれば (追記: SNI をサポートした 0.9.8f が 10/11 にリリースされた)、 apache などの WWW サーバにおいても SNI サポートが普通になると思われるが、 それまでは stone で SSL 暗号化を行なうようにすれば、 手軽に SNI を利用できる。 サーバに OpenSSL 0.9.9 をインストールしてしまうと、 OpenSSL を利用する全てのソフトウェアが影響を受けてしまうが、 例えば以下のように stone.c をコンパイル (Linux でのコンパイル例) して、 stone だけ 0.9.9 をリンクするようにすれば、 影響を stone だけに限定できる。

% cc -Wall -DCPP='"/usr/bin/cpp -traditional"' \
     -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_POP -DUSE_SSL \
     -I /usr/local/ssl-0.9.9/include -L /usr/local/ssl-0.9.9/lib \
     -o stone stone.c -lpthread -ldl -lssl -lcrypto

以上は stone が SSL サーバとして、 サーバホスト名通知を受付ける場合であるが、 もちろん stone を SSL クライアントとして実行し、 サーバホスト名を通知することもできる。

% stone -q sni -q verbose -q verify -q CApath=/usr/local/ssl/certs
        -q servername=asao.gcd.org localhost:443/ssl 10080
Jun 23 08:43:46.116894 3084876480 start (2.3c) [18500]
Jun 23 08:43:46.185448 3084876480 stone 3: 127.0.0.1:443/ssl <- 0.0.0.0:10080
Jun 23 08:43:48.610513 3084876480 3 TCP 6: [depth2=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/CN=GCD Root CA/emailAddress=root@gcd.org]
Jun 23 08:43:48.610707 3084876480 3 TCP 6: [depth1=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=GCD_Sengoku_CA/emailAddress=sengoku@gcd.org]
Jun 23 08:43:48.610928 3084876480 3 TCP 6: [depth0=/C=JP/ST=Kanagawa/L=Kawasaki/O=GCD/OU=Hiroaki Sengoku/CN=asao.gcd.org/emailAddress=sengoku@gcd.org]
Jun 23 08:43:48.624724 3084876480 [SSL cipher=AES256-SHA]

「-q servername=asao.gcd.org」オプションで、 通知するサーバホスト名を指定している。 この実行例の場合「asao.gcd.org」を通知しているので、 サーバからは「CN=asao.gcd.org」の証明書が返されている。 この実行例では、中継先が「localhost:443」であるので 「-q servername=」オプションを指定する必要があるが、 もし中継先 (サーバ) ホスト名が通知すべきサーバホスト名に一致するのであれば、 「-q servername=」オプションは省略できる。

Filed under: stone 開発日記 — hiroaki_sengoku @ 07:20

9 Comments


  1. [Linux] stoneSSL-IPVirtual

     1IP1ApacheVirtualSSL IP

    Comment by -'s BLOG-()  2007115 @ 21:34 




    stoneSSLURL
    OPENSSL-0.9.8gTLS使 使

    stone.c:  `mkStoneSSL :
    stone.c:7332: : 1 `SSL_CTX_new 


    Comment by   2007115 @ 21:43 




    0.9.8 ssl.h 
    SSL_CTX *SSL_CTX_new(SSL_METHOD *meth);

    0.9.9 
    SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);

    stone.c  0.9.9  const 

    Comment by   2007116 @ 01:44 



     使

    Comment by   2007116 @ 05:26 



    SSLCASNIServerhttpsSever1SSL

    Comment by   20071219 @ 12:58 



    便STONE使(1) MSKMS (2) SSL V3 Poodle
    (3) PostFIX  SMTP/Submission Over SSL/TLS


    Comment by hash  2015123 @ 14:56 



    stone10NW
    TLS

    stone -q sni -q tls1 -q verbose -q verify,none -q CApath=/etc/letsencrypt/live/mydomain.org localhost:10022/ssl 20022

    10022Nginx
    teraterm)stone20022
    sshClientHello
    NginxTCP

    Comment by   2018320 @ 22:07 



    ssh 

    stone  ssh ssh  Virtual Host 

    TLS  ClientHello  virtual ( Virtual Host ) -q servername=virtual stone  -q sni virtual:10022/ssl 20022 

    Comment by hiroaki_sengoku  2018321 @ 21:59 




    -q servernameNginx


    teraterm




    windows -teratermssh-> [{stone:20022}ssl>{Nginx:10022}] ssh>[Nginx]

    {}
    []
    LXDstoneiptablesNAT






    Comment by   2018322 @ 00:30 



    RSS feed for comments on this post.

    Sorry, the comment form is closed at this time.