Skip to content

Commit 1fe72e5

Browse files
authored
Make IPv6 SSL test passing (#1511)
* Validate negatively certificate chain of zero length * Use IP addr as host name to SSL-authenticate if host name not available * Update SSL tests
1 parent e239da6 commit 1fe72e5

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

Src/IronPython.Modules/_ssl.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,11 @@ internal bool CertValidationCallbackRequired(object sender, X509Certificate cert
401401
}
402402

403403
private void ValidateCertificate(X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
404-
Debug.Assert(chain.ChainStatus.Length > 0);
404+
if (chain.ChainStatus.Length == 0) {
405+
ValidationError(sslPolicyErrors);
406+
return;
407+
}
408+
405409
foreach (var elem in chain.ChainStatus) {
406410
if (elem.Status == X509ChainStatusFlags.UntrustedRoot) {
407411
bool isOk = false;
@@ -448,7 +452,12 @@ public void do_handshake() {
448452
}
449453
_sslStream.AuthenticateAsServer(_cert, _certsMode == PythonSsl.CERT_REQUIRED, enabledSslProtocols, false);
450454
} else {
451-
_sslStream.AuthenticateAsClient(server_hostname ?? _socket._hostName, context._cert_store, enabledSslProtocols, false);
455+
string hostname = server_hostname ?? _socket._hostName ?? _socket._socket.RemoteEndPoint switch {
456+
System.Net.IPEndPoint ipEP => ipEP.Address.ToString(),
457+
System.Net.DnsEndPoint dnsEP => dnsEP.Host,
458+
_ => string.Empty,
459+
};
460+
_sslStream.AuthenticateAsClient(hostname, context._cert_store, enabledSslProtocols, false);
452461
}
453462
} catch (AuthenticationException e) {
454463
((IDisposable)_socket._socket).Dispose();

Tests/test_ssl_stdlib.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ def load_tests(loader, standard_tests, pattern):
8181
suite.addTest(test.test_ssl.MemoryBIOTests('test_error_types'))
8282
suite.addTest(test.test_ssl.MemoryBIOTests('test_pending'))
8383
suite.addTest(test.test_ssl.MemoryBIOTests('test_read_write'))
84-
suite.addTest(unittest.expectedFailure(test.test_ssl.NetworkedTests('test_get_server_certificate_ipv6'))) # TypeError (ArgumentNullException for targetHost in call to AuthenticateAsClient in _ssl.cs)
84+
suite.addTest(test.test_ssl.NetworkedTests('test_get_server_certificate_ipv6'))
8585
suite.addTest(test.test_ssl.NetworkedTests('test_timeout_connect_ex'))
8686
suite.addTest(unittest.expectedFailure(test.test_ssl.SSLErrorTests('test_lib_reason'))) # AttributeError: 'SSLContext' object has no attribute 'load_dh_params'
8787
suite.addTest(unittest.expectedFailure(test.test_ssl.SSLErrorTests('test_str'))) # AssertionError: '[Errno 1] foo' != 'foo'
88-
suite.addTest(unittest.expectedFailure(test.test_ssl.SSLErrorTests('test_subclass'))) # TypeError: Value cannot be null.
88+
#suite.addTest(unittest.expectedFailure(test.test_ssl.SSLErrorTests('test_subclass'))) # hangs indefinitely: wrapped SSLSocket resets timeout to None
8989
#suite.addTest(test.test_ssl.SimpleBackgroundTests('test_bio_handshake'))
9090
#suite.addTest(test.test_ssl.SimpleBackgroundTests('test_bio_read_write_data'))
9191
#suite.addTest(test.test_ssl.SimpleBackgroundTests('test_ciphers'))
@@ -123,7 +123,7 @@ def load_tests(loader, standard_tests, pattern):
123123
#suite.addTest(test.test_ssl.ThreadedTests('test_echo'))
124124
#suite.addTest(test.test_ssl.ThreadedTests('test_getpeercert')) # blocking
125125
suite.addTest(test.test_ssl.ThreadedTests('test_getpeercert_enotconn'))
126-
suite.addTest(unittest.expectedFailure(test.test_ssl.ThreadedTests('test_handshake_timeout'))) # TypeError: Value cannot be null.
126+
#suite.addTest(unittest.expectedFailure(test.test_ssl.ThreadedTests('test_handshake_timeout'))) # hangs indefinitely: wrapped SSLSocket resets timeout to None
127127
#suite.addTest(test.test_ssl.ThreadedTests('test_no_shared_ciphers'))
128128
#suite.addTest(test.test_ssl.ThreadedTests('test_nonblocking_send'))
129129
#suite.addTest(test.test_ssl.ThreadedTests('test_npn_protocols'))
@@ -136,7 +136,7 @@ def load_tests(loader, standard_tests, pattern):
136136
#suite.addTest(test.test_ssl.ThreadedTests('test_read_write_after_close_raises_valuerror')) # blocking
137137
#suite.addTest(unittest.expectedFailure(test.test_ssl.ThreadedTests('test_recv_send'))) # NotImplementedError: keyfile
138138
#suite.addTest(test.test_ssl.ThreadedTests('test_recv_zero'))
139-
suite.addTest(unittest.expectedFailure(test.test_ssl.ThreadedTests('test_rude_shutdown'))) # TypeError: Value cannot be null.
139+
suite.addTest(test.test_ssl.ThreadedTests('test_rude_shutdown'))
140140
#suite.addTest(test.test_ssl.ThreadedTests('test_selected_alpn_protocol'))
141141
#suite.addTest(test.test_ssl.ThreadedTests('test_selected_alpn_protocol_if_server_uses_alpn'))
142142
#suite.addTest(test.test_ssl.ThreadedTests('test_selected_npn_protocol'))

0 commit comments

Comments
 (0)