@@ -109,4 +109,89 @@ def test_check_ssl_virtual
109109 end
110110 }
111111 end
112+
113+ def test_ssl_meta_vars
114+ # CA cert
115+ ca_cert , ca_key = WEBrick ::Utils . create_self_signed_cert ( 2048 , "/CN=ca" , "is CA" )
116+ ef = OpenSSL ::X509 ::ExtensionFactory . new
117+ ef . subject_certificate = ca_cert
118+ ef . issuer_certificate = ca_cert
119+ ca_cert . extensions = [
120+ ef . create_extension ( "basicConstraints" , "CA:TRUE" , true ) ,
121+ ef . create_extension ( "keyUsage" , "keyCertSign, cRLSign" , true ) ,
122+ ef . create_extension ( "subjectKeyIdentifier" , "hash" , false )
123+ ]
124+ ca_cert . add_extension ef . create_extension ( "authorityKeyIdentifier" , "keyid:always,issuer:always" )
125+ ca_cert . sign ( ca_key , "SHA256" )
126+
127+ # Client cert
128+ client_cert , client_key = WEBrick ::Utils . create_self_signed_cert ( 2048 , "/CN=client" , "is client" )
129+ client_cert . issuer = ca_cert . issuer
130+ ef = OpenSSL ::X509 ::ExtensionFactory . new
131+ ef . subject_certificate = client_cert
132+ ef . issuer_certificate = ca_cert
133+ client_cert . extensions = [
134+ ef . create_extension ( "basicConstraints" , "CA:FALSE" , true ) ,
135+ ef . create_extension ( "keyUsage" , "digitalSignature" , true ) ,
136+ ef . create_extension ( "subjectKeyIdentifier" , "hash" , false ) ,
137+ ef . create_extension ( "subjectAltName" , "DNS:localhost,IP:127.0.0.1" , false )
138+ ]
139+ client_cert . sign ( ca_key , "SHA256" )
140+
141+
142+ # Server cert
143+ server_cert , server_key = WEBrick ::Utils . create_self_signed_cert ( 2048 , "/CN=server" , "is server" )
144+ server_cert . issuer = ca_cert . issuer
145+ ef = OpenSSL ::X509 ::ExtensionFactory . new
146+ ef . subject_certificate = server_cert
147+ ef . issuer_certificate = ca_cert
148+ server_cert . extensions = [
149+ ef . create_extension ( "basicConstraints" , "CA:FALSE" , true ) ,
150+ ef . create_extension ( "keyUsage" , "digitalSignature" , true ) ,
151+ ef . create_extension ( "subjectKeyIdentifier" , "hash" , false ) ,
152+ ef . create_extension ( "subjectAltName" , "DNS:localhost,IP:127.0.0.1" , false )
153+ ]
154+ server_cert . sign ( ca_key , "SHA256" )
155+
156+ # Client CA Store
157+ ca_client_store = OpenSSL ::X509 ::Store . new
158+ ca_client_store . add_cert ( ca_cert )
159+ ca_client_store . add_cert ( client_cert )
160+
161+ # Server CA Store
162+ server_ca_store = OpenSSL ::X509 ::Store . new
163+ server_ca_store . add_cert ( ca_cert )
164+ server_ca_store . add_cert ( server_cert )
165+
166+ config = {
167+ SSLEnable : true ,
168+ :SSLCertName => "/CN=localhost" ,
169+ SSLCertificate : server_cert ,
170+ SSLPrivateKey : server_key ,
171+ SSLVerifyClient : OpenSSL ::SSL ::VERIFY_PEER ,
172+ SSLCertificateStore : ca_client_store
173+ }
174+ TestWEBrick . start_httpserver ( config ) { |server , addr , port , log |
175+ env = nil
176+ server . mount_proc ( "/" ) { |req , res |
177+ env = req . meta_vars
178+ res . body = "OK"
179+ }
180+
181+ subject = nil
182+ http = Net ::HTTP . new ( addr , port )
183+ http . use_ssl = true
184+ http . verify_mode = OpenSSL ::SSL ::VERIFY_CLIENT_ONCE
185+ http . cert = client_cert
186+ http . key = client_key
187+ http . extra_chain_cert = [ ca_cert ]
188+ http . cert_store = server_ca_store
189+ req = Net ::HTTP ::Get . new ( "/" )
190+ body = http . request ( req ) . body
191+ assert_not_nil ( env )
192+ assert_equal ( "SUCCESS" , env [ "SSL_CLIENT_VERIFY" ] )
193+ assert_equal ( "/CN=client" , env [ "SSL_CLIENT_S_DN" ] )
194+ assert_equal ( client_cert . to_pem , env [ "SSL_CLIENT_CERT" ] )
195+ }
196+ end
112197end
0 commit comments