| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """This is a simple HTTP/FTP/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for | 6 """This is a simple HTTP/FTP/TCP/UDP/BASIC_AUTH_PROXY/WEBSOCKET server used for |
| 7 testing Chrome. | 7 testing Chrome. |
| 8 | 8 |
| 9 It supports several test URLs, as specified by the handlers in TestPageHandler. | 9 It supports several test URLs, as specified by the handlers in TestPageHandler. |
| 10 By default, it listens on an ephemeral port and sends the port number back to | 10 By default, it listens on an ephemeral port and sends the port number back to |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 class HTTPSServer(tlslite.api.TLSSocketServerMixIn, | 147 class HTTPSServer(tlslite.api.TLSSocketServerMixIn, |
| 148 testserver_base.ClientRestrictingServerMixIn, | 148 testserver_base.ClientRestrictingServerMixIn, |
| 149 testserver_base.BrokenPipeHandlerMixIn, | 149 testserver_base.BrokenPipeHandlerMixIn, |
| 150 testserver_base.StoppableHTTPServer): | 150 testserver_base.StoppableHTTPServer): |
| 151 """This is a specialization of StoppableHTTPServer that add https support and | 151 """This is a specialization of StoppableHTTPServer that add https support and |
| 152 client verification.""" | 152 client verification.""" |
| 153 | 153 |
| 154 def __init__(self, server_address, request_hander_class, pem_cert_and_key, | 154 def __init__(self, server_address, request_hander_class, pem_cert_and_key, |
| 155 ssl_client_auth, ssl_client_cas, ssl_client_cert_types, | 155 ssl_client_auth, ssl_client_cas, ssl_client_cert_types, |
| 156 ssl_bulk_ciphers, ssl_key_exchanges, enable_npn, | 156 ssl_bulk_ciphers, ssl_key_exchanges, enable_npn, |
| 157 record_resume_info, tls_intolerant, signed_cert_timestamps, | 157 record_resume_info, tls_intolerant, |
| 158 reset_on_intolerance, signed_cert_timestamps, |
| 158 fallback_scsv_enabled, ocsp_response): | 159 fallback_scsv_enabled, ocsp_response): |
| 159 self.cert_chain = tlslite.api.X509CertChain() | 160 self.cert_chain = tlslite.api.X509CertChain() |
| 160 self.cert_chain.parsePemList(pem_cert_and_key) | 161 self.cert_chain.parsePemList(pem_cert_and_key) |
| 161 # Force using only python implementation - otherwise behavior is different | 162 # Force using only python implementation - otherwise behavior is different |
| 162 # depending on whether m2crypto Python module is present (error is thrown | 163 # depending on whether m2crypto Python module is present (error is thrown |
| 163 # when it is). m2crypto uses a C (based on OpenSSL) implementation under | 164 # when it is). m2crypto uses a C (based on OpenSSL) implementation under |
| 164 # the hood. | 165 # the hood. |
| 165 self.private_key = tlslite.api.parsePEMKey(pem_cert_and_key, | 166 self.private_key = tlslite.api.parsePEMKey(pem_cert_and_key, |
| 166 private=True, | 167 private=True, |
| 167 implementations=['python']) | 168 implementations=['python']) |
| 168 self.ssl_client_auth = ssl_client_auth | 169 self.ssl_client_auth = ssl_client_auth |
| 169 self.ssl_client_cas = [] | 170 self.ssl_client_cas = [] |
| 170 self.ssl_client_cert_types = [] | 171 self.ssl_client_cert_types = [] |
| 171 if enable_npn: | 172 if enable_npn: |
| 172 self.next_protos = ['http/1.1'] | 173 self.next_protos = ['http/1.1'] |
| 173 else: | 174 else: |
| 174 self.next_protos = None | 175 self.next_protos = None |
| 175 if tls_intolerant == 0: | |
| 176 self.tls_intolerant = None | |
| 177 else: | |
| 178 self.tls_intolerant = (3, tls_intolerant) | |
| 179 self.signed_cert_timestamps = signed_cert_timestamps | 176 self.signed_cert_timestamps = signed_cert_timestamps |
| 180 self.fallback_scsv_enabled = fallback_scsv_enabled | 177 self.fallback_scsv_enabled = fallback_scsv_enabled |
| 181 self.ocsp_response = ocsp_response | 178 self.ocsp_response = ocsp_response |
| 182 | 179 |
| 183 if ssl_client_auth: | 180 if ssl_client_auth: |
| 184 for ca_file in ssl_client_cas: | 181 for ca_file in ssl_client_cas: |
| 185 s = open(ca_file).read() | 182 s = open(ca_file).read() |
| 186 x509 = tlslite.api.X509() | 183 x509 = tlslite.api.X509() |
| 187 x509.parse(s) | 184 x509.parse(s) |
| 188 self.ssl_client_cas.append(x509.subject) | 185 self.ssl_client_cas.append(x509.subject) |
| 189 | 186 |
| 190 for cert_type in ssl_client_cert_types: | 187 for cert_type in ssl_client_cert_types: |
| 191 self.ssl_client_cert_types.append({ | 188 self.ssl_client_cert_types.append({ |
| 192 "rsa_sign": tlslite.api.ClientCertificateType.rsa_sign, | 189 "rsa_sign": tlslite.api.ClientCertificateType.rsa_sign, |
| 193 "dss_sign": tlslite.api.ClientCertificateType.dss_sign, | 190 "dss_sign": tlslite.api.ClientCertificateType.dss_sign, |
| 194 "ecdsa_sign": tlslite.api.ClientCertificateType.ecdsa_sign, | 191 "ecdsa_sign": tlslite.api.ClientCertificateType.ecdsa_sign, |
| 195 }[cert_type]) | 192 }[cert_type]) |
| 196 | 193 |
| 197 self.ssl_handshake_settings = tlslite.api.HandshakeSettings() | 194 self.ssl_handshake_settings = tlslite.api.HandshakeSettings() |
| 198 if ssl_bulk_ciphers is not None: | 195 if ssl_bulk_ciphers is not None: |
| 199 self.ssl_handshake_settings.cipherNames = ssl_bulk_ciphers | 196 self.ssl_handshake_settings.cipherNames = ssl_bulk_ciphers |
| 200 if ssl_key_exchanges is not None: | 197 if ssl_key_exchanges is not None: |
| 201 self.ssl_handshake_settings.keyExchangeNames = ssl_key_exchanges | 198 self.ssl_handshake_settings.keyExchangeNames = ssl_key_exchanges |
| 199 if tls_intolerant != 0: |
| 200 self.ssl_handshake_settings.tlsIntolerant = (3, tls_intolerant) |
| 201 self.ssl_handshake_settings.resetOnIntolerance = reset_on_intolerance |
| 202 | 202 |
| 203 if record_resume_info: | 203 if record_resume_info: |
| 204 # If record_resume_info is true then we'll replace the session cache with | 204 # If record_resume_info is true then we'll replace the session cache with |
| 205 # an object that records the lookups and inserts that it sees. | 205 # an object that records the lookups and inserts that it sees. |
| 206 self.session_cache = RecordingSSLSessionCache() | 206 self.session_cache = RecordingSSLSessionCache() |
| 207 else: | 207 else: |
| 208 self.session_cache = tlslite.api.SessionCache() | 208 self.session_cache = tlslite.api.SessionCache() |
| 209 testserver_base.StoppableHTTPServer.__init__(self, | 209 testserver_base.StoppableHTTPServer.__init__(self, |
| 210 server_address, | 210 server_address, |
| 211 request_hander_class) | 211 request_hander_class) |
| 212 | 212 |
| 213 def handshake(self, tlsConnection): | 213 def handshake(self, tlsConnection): |
| 214 """Creates the SSL connection.""" | 214 """Creates the SSL connection.""" |
| 215 | 215 |
| 216 try: | 216 try: |
| 217 self.tlsConnection = tlsConnection | 217 self.tlsConnection = tlsConnection |
| 218 tlsConnection.handshakeServer(certChain=self.cert_chain, | 218 tlsConnection.handshakeServer(certChain=self.cert_chain, |
| 219 privateKey=self.private_key, | 219 privateKey=self.private_key, |
| 220 sessionCache=self.session_cache, | 220 sessionCache=self.session_cache, |
| 221 reqCert=self.ssl_client_auth, | 221 reqCert=self.ssl_client_auth, |
| 222 settings=self.ssl_handshake_settings, | 222 settings=self.ssl_handshake_settings, |
| 223 reqCAs=self.ssl_client_cas, | 223 reqCAs=self.ssl_client_cas, |
| 224 reqCertTypes=self.ssl_client_cert_types, | 224 reqCertTypes=self.ssl_client_cert_types, |
| 225 nextProtos=self.next_protos, | 225 nextProtos=self.next_protos, |
| 226 tlsIntolerant=self.tls_intolerant, | |
| 227 signedCertTimestamps= | 226 signedCertTimestamps= |
| 228 self.signed_cert_timestamps, | 227 self.signed_cert_timestamps, |
| 229 fallbackSCSV=self.fallback_scsv_enabled, | 228 fallbackSCSV=self.fallback_scsv_enabled, |
| 230 ocspResponse = self.ocsp_response) | 229 ocspResponse = self.ocsp_response) |
| 231 tlsConnection.ignoreAbruptClose = True | 230 tlsConnection.ignoreAbruptClose = True |
| 232 return True | 231 return True |
| 233 except tlslite.api.TLSAbruptCloseError: | 232 except tlslite.api.TLSAbruptCloseError: |
| 234 # Ignore abrupt close. | 233 # Ignore abrupt close. |
| 235 return True | 234 return True |
| 236 except tlslite.api.TLSError, error: | 235 except tlslite.api.TLSError, error: |
| (...skipping 1762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1999 | 1998 |
| 2000 server = HTTPSServer((host, port), TestPageHandler, pem_cert_and_key, | 1999 server = HTTPSServer((host, port), TestPageHandler, pem_cert_and_key, |
| 2001 self.options.ssl_client_auth, | 2000 self.options.ssl_client_auth, |
| 2002 self.options.ssl_client_ca, | 2001 self.options.ssl_client_ca, |
| 2003 self.options.ssl_client_cert_type, | 2002 self.options.ssl_client_cert_type, |
| 2004 self.options.ssl_bulk_cipher, | 2003 self.options.ssl_bulk_cipher, |
| 2005 self.options.ssl_key_exchange, | 2004 self.options.ssl_key_exchange, |
| 2006 self.options.enable_npn, | 2005 self.options.enable_npn, |
| 2007 self.options.record_resume, | 2006 self.options.record_resume, |
| 2008 self.options.tls_intolerant, | 2007 self.options.tls_intolerant, |
| 2008 self.options.reset_on_intolerance, |
| 2009 self.options.signed_cert_timestamps_tls_ext.decode( | 2009 self.options.signed_cert_timestamps_tls_ext.decode( |
| 2010 "base64"), | 2010 "base64"), |
| 2011 self.options.fallback_scsv, | 2011 self.options.fallback_scsv, |
| 2012 stapled_ocsp_response) | 2012 stapled_ocsp_response) |
| 2013 print 'HTTPS server started on %s:%d...' % (host, server.server_port) | 2013 print 'HTTPS server started on %s:%d...' % (host, server.server_port) |
| 2014 else: | 2014 else: |
| 2015 server = HTTPServer((host, port), TestPageHandler) | 2015 server = HTTPServer((host, port), TestPageHandler) |
| 2016 print 'HTTP server started on %s:%d...' % (host, server.server_port) | 2016 print 'HTTP server started on %s:%d...' % (host, server.server_port) |
| 2017 | 2017 |
| 2018 server.data_dir = self.__make_data_dir() | 2018 server.data_dir = self.__make_data_dir() |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2140 help='If non-zero then the generated ' | 2140 help='If non-zero then the generated ' |
| 2141 'certificate will have this serial number') | 2141 'certificate will have this serial number') |
| 2142 self.option_parser.add_option('--tls-intolerant', dest='tls_intolerant', | 2142 self.option_parser.add_option('--tls-intolerant', dest='tls_intolerant', |
| 2143 default='0', type='int', | 2143 default='0', type='int', |
| 2144 help='If nonzero, certain TLS connections ' | 2144 help='If nonzero, certain TLS connections ' |
| 2145 'will be aborted in order to test version ' | 2145 'will be aborted in order to test version ' |
| 2146 'fallback. 1 means all TLS versions will be ' | 2146 'fallback. 1 means all TLS versions will be ' |
| 2147 'aborted. 2 means TLS 1.1 or higher will be ' | 2147 'aborted. 2 means TLS 1.1 or higher will be ' |
| 2148 'aborted. 3 means TLS 1.2 or higher will be ' | 2148 'aborted. 3 means TLS 1.2 or higher will be ' |
| 2149 'aborted.') | 2149 'aborted.') |
| 2150 self.option_parser.add_option('--reset-on-intolerance', |
| 2151 dest='reset_on_intolerance', |
| 2152 default=False, const=True, |
| 2153 action='store_const', |
| 2154 help='Send a TCP reset on TLS version ' |
| 2155 'intolerance rather than a handshake alert') |
| 2150 self.option_parser.add_option('--signed-cert-timestamps-tls-ext', | 2156 self.option_parser.add_option('--signed-cert-timestamps-tls-ext', |
| 2151 dest='signed_cert_timestamps_tls_ext', | 2157 dest='signed_cert_timestamps_tls_ext', |
| 2152 default='', | 2158 default='', |
| 2153 help='Base64 encoded SCT list. If set, ' | 2159 help='Base64 encoded SCT list. If set, ' |
| 2154 'server will respond with a ' | 2160 'server will respond with a ' |
| 2155 'signed_certificate_timestamp TLS extension ' | 2161 'signed_certificate_timestamp TLS extension ' |
| 2156 'whenever the client supports it.') | 2162 'whenever the client supports it.') |
| 2157 self.option_parser.add_option('--fallback-scsv', dest='fallback_scsv', | 2163 self.option_parser.add_option('--fallback-scsv', dest='fallback_scsv', |
| 2158 default=False, const=True, | 2164 default=False, const=True, |
| 2159 action='store_const', | 2165 action='store_const', |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2215 action='store_const', | 2221 action='store_const', |
| 2216 help='Enable server support for the NPN ' | 2222 help='Enable server support for the NPN ' |
| 2217 'extension. The server will advertise ' | 2223 'extension. The server will advertise ' |
| 2218 'support for exactly one protocol, http/1.1') | 2224 'support for exactly one protocol, http/1.1') |
| 2219 self.option_parser.add_option('--file-root-url', default='/files/', | 2225 self.option_parser.add_option('--file-root-url', default='/files/', |
| 2220 help='Specify a root URL for files served.') | 2226 help='Specify a root URL for files served.') |
| 2221 | 2227 |
| 2222 | 2228 |
| 2223 if __name__ == '__main__': | 2229 if __name__ == '__main__': |
| 2224 sys.exit(ServerRunner().main()) | 2230 sys.exit(ServerRunner().main()) |
| OLD | NEW |