1+ --TEST--
2+ CURLOPT_SSL* basic client auth tests
3+ --EXTENSIONS--
4+ curl
5+ --SKIPIF--
6+ <?php 
7+ if  (!function_exists ("proc_open " )) die ("skip no proc_open " );
8+ exec ('openssl version ' , $ out$ code
9+ if  ($ code0 ) die ("skip couldn't locate openssl binary " );
10+ if  (PHP_OS_FAMILY  === 'Windows ' ) die ('skip not for Windows ' );
11+ $ curl_versioncurl_version ();
12+ if  ($ curl_version'version_number ' ] < 0x074700 ) {
13+     die ("skip: blob options not supported for curl < 7.71.0 " );
14+ }
15+ ?> 
16+ --FILE--
17+ <?php 
18+ 
19+ function  check_error (CurlHandle $ ch
20+     if  (curl_errno ($ ch0 ) {
21+         echo  "CURL ERROR:  "  . curl_errno ($ ch"\n" ;
22+     }
23+ }
24+ 
25+ function  check_response ($ response$ clientCertSubject
26+     if  (strpos ($ response$ clientCertSubjectfalse ) {
27+         echo  "client cert subject not in response \n" ;
28+     } else  {
29+         echo  "client cert subject in response \n" ;
30+     }
31+ }
32+ 
33+ $ clientCertSubject"Subject: C=US, ST=TX, L=Clientlocation, O=Clientcompany, CN=clientname/emailAddress=test@example.com " ;
34+ 
35+ // load server cert 
36+ $ serverCertPath__DIR__  . DIRECTORY_SEPARATOR  . 'curl_setopt_ssl_servercert.pem ' ;
37+ $ serverCertfile_get_contents ($ serverCertPath
38+ 
39+ // load server key 
40+ $ serverKeyPath__DIR__  . DIRECTORY_SEPARATOR  . 'curl_setopt_ssl_serverkey.pem ' ;
41+ $ serverKeyfile_get_contents ($ serverKeyPath
42+ 
43+ // load client cert 
44+ $ clientCertPath__DIR__  . DIRECTORY_SEPARATOR  . 'curl_setopt_ssl_clientcert.pem ' ;
45+ $ clientCertfile_get_contents ($ clientCertPath
46+ 
47+ // load client key 
48+ $ clientKeyPath__DIR__  . DIRECTORY_SEPARATOR  . 'curl_setopt_ssl_clientkey.pem ' ;
49+ $ clientKeyfile_get_contents ($ clientKeyPath
50+ 
51+ if  ($ serverCertfalse 
52+     || $ serverKeyfalse 
53+     || $ clientCertfalse 
54+     || $ clientKeyfalse 
55+ ) {
56+     die ('failed to load test certs and keys for files ' );
57+ }
58+ 
59+ $ port14430 ;
60+ 
61+ // set up local server 
62+ $ cmd"openssl s_server -key  $ serverKeyPath -cert  $ serverCertPath -accept  $ port -www -CAfile  $ clientCertPath -verify_return_error -Verify 1 " ;
63+ $ processproc_open ($ cmd"pipe " , "r " ], ["pipe " , "w " ], ["pipe " , "w " ]], $ pipes
64+ 
65+ if  ($ processfalse ) {
66+     die ('failed to start server ' );
67+ }
68+ try  {
69+     // Give the server time to start 
70+     sleep (1 );
71+ 
72+     echo  "case 1: client cert and key from string \n" ;
73+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
74+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT_BLOB , $ clientCert
75+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY_BLOB , $ clientKey
76+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , false ));
77+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
78+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
79+ 
80+     $ responsecurl_exec ($ ch
81+     check_response ($ response$ clientCertSubject
82+     check_error ($ ch
83+     curl_close ($ ch
84+ 
85+     echo  "\n" ;
86+     echo  "case 2: empty client cert and key from string \n" ;
87+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
88+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT_BLOB , '' ));
89+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY_BLOB , $ clientKey
90+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , false ));
91+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
92+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
93+ 
94+     $ responsecurl_exec ($ ch
95+     check_response ($ response$ clientCertSubject
96+     check_error ($ ch
97+     curl_close ($ ch
98+ 
99+     echo  "\n" ;
100+     echo  "case 3: client cert and empty key from string \n" ;
101+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
102+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT_BLOB , $ clientCert
103+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY_BLOB , '' ));
104+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , false ));
105+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
106+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
107+ 
108+     $ responsecurl_exec ($ ch
109+     check_response ($ response$ clientCertSubject
110+     check_error ($ ch
111+     curl_close ($ ch
112+ 
113+     echo  "\n" ;
114+     echo  "case 4: client cert and key from file \n" ;
115+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
116+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT , $ clientCertPath
117+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY , $ clientKeyPath
118+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , false ));
119+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
120+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
121+ 
122+     $ responsecurl_exec ($ ch
123+     check_response ($ response$ clientCertSubject
124+     check_error ($ ch
125+     curl_close ($ ch
126+ 
127+     echo  "\n" ;
128+     echo  "case 5: issuer cert from file \n" ;
129+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
130+     var_dump (curl_setopt ($ chCURLOPT_CAINFO , $ serverCertPath
131+     var_dump (curl_setopt ($ chCURLOPT_ISSUERCERT , $ serverCertPath
132+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT , $ clientCertPath
133+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY , $ clientKeyPath
134+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , true ));
135+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
136+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
137+ 
138+     $ responsecurl_exec ($ ch
139+     check_response ($ response$ clientCertSubject
140+     check_error ($ ch
141+     curl_close ($ ch
142+ 
143+     echo  "\n" ;
144+     echo  "case 6: issuer cert from string \n" ;
145+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
146+     var_dump (curl_setopt ($ chCURLOPT_CAINFO , $ serverCertPath
147+     var_dump (curl_setopt ($ chCURLOPT_ISSUERCERT_BLOB , $ serverCert
148+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT , $ clientCertPath
149+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY , $ clientKeyPath
150+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , true ));
151+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
152+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
153+ 
154+     $ responsecurl_exec ($ ch
155+     check_response ($ response$ clientCertSubject
156+     check_error ($ ch
157+     curl_close ($ ch
158+ 
159+     echo  "\n" ;
160+     echo  "case 7: empty issuer cert from string \n" ;
161+     $ chcurl_init ("https://127.0.0.1: $ port/ " );
162+     var_dump (curl_setopt ($ chCURLOPT_CAINFO , $ serverCertPath
163+     var_dump (curl_setopt ($ chCURLOPT_ISSUERCERT_BLOB , '' ));
164+     var_dump (curl_setopt ($ chCURLOPT_SSLCERT , $ clientCertPath
165+     var_dump (curl_setopt ($ chCURLOPT_SSLKEY , $ clientKeyPath
166+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYPEER , true ));
167+     var_dump (curl_setopt ($ chCURLOPT_SSL_VERIFYHOST , false ));
168+     curl_setopt ($ chCURLOPT_RETURNTRANSFER , 1 );
169+ 
170+     $ responsecurl_exec ($ ch
171+     check_response ($ response$ clientCertSubject
172+     check_error ($ ch
173+     curl_close ($ ch
174+ 
175+ } finally  {
176+     // clean up server process 
177+     proc_terminate ($ process
178+     proc_close ($ process
179+ }
180+ 
181+ ?> 
182+ --EXPECT--
183+ case 1: client cert and key from string
184+ bool(true)
185+ bool(true)
186+ bool(true)
187+ bool(true)
188+ client cert subject in response
189+ 
190+ case 2: empty client cert and key from string
191+ bool(true)
192+ bool(true)
193+ bool(true)
194+ bool(true)
195+ client cert subject not in response
196+ CURL ERROR: 58
197+ 
198+ case 3: client cert and empty key from string
199+ bool(true)
200+ bool(true)
201+ bool(true)
202+ bool(true)
203+ client cert subject not in response
204+ CURL ERROR: 58
205+ 
206+ case 4: client cert and key from file
207+ bool(true)
208+ bool(true)
209+ bool(true)
210+ bool(true)
211+ client cert subject in response
212+ 
213+ case 5: issuer cert from file
214+ bool(true)
215+ bool(true)
216+ bool(true)
217+ bool(true)
218+ bool(true)
219+ bool(true)
220+ client cert subject in response
221+ 
222+ case 6: issuer cert from string
223+ bool(true)
224+ bool(true)
225+ bool(true)
226+ bool(true)
227+ bool(true)
228+ bool(true)
229+ client cert subject in response
230+ 
231+ case 7: empty issuer cert from string
232+ bool(true)
233+ bool(true)
234+ bool(true)
235+ bool(true)
236+ bool(true)
237+ bool(true)
238+ client cert subject not in response
239+ CURL ERROR: 83
0 commit comments