| OLD | NEW |
| 1 # Copyright 2014 Google Inc. All Rights Reserved. | 1 # Copyright 2014 Google Inc. All Rights Reserved. |
| 2 # | 2 # |
| 3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
| 5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
| 6 # | 6 # |
| 7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
| 8 # | 8 # |
| 9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
| 10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 ca_cert.set_serial_number(int(time.time()*10000)) | 123 ca_cert.set_serial_number(int(time.time()*10000)) |
| 124 ca_cert.set_version(2) | 124 ca_cert.set_version(2) |
| 125 ca_cert.get_subject().CN = subject | 125 ca_cert.get_subject().CN = subject |
| 126 ca_cert.get_subject().O = subject | 126 ca_cert.get_subject().O = subject |
| 127 ca_cert.gmtime_adj_notBefore(-60 * 60 * 24 * 365 * 2) | 127 ca_cert.gmtime_adj_notBefore(-60 * 60 * 24 * 365 * 2) |
| 128 ca_cert.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 2) | 128 ca_cert.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 2) |
| 129 ca_cert.set_issuer(ca_cert.get_subject()) | 129 ca_cert.set_issuer(ca_cert.get_subject()) |
| 130 ca_cert.set_pubkey(key) | 130 ca_cert.set_pubkey(key) |
| 131 ca_cert.add_extensions([ | 131 ca_cert.add_extensions([ |
| 132 crypto.X509Extension('basicConstraints', True, 'CA:TRUE'), | 132 crypto.X509Extension('basicConstraints', True, 'CA:TRUE'), |
| 133 crypto.X509Extension('subjectAltName', False, 'DNS:' + subject), | |
| 134 crypto.X509Extension('nsCertType', True, 'sslCA'), | |
| 135 crypto.X509Extension('extendedKeyUsage', True, | 133 crypto.X509Extension('extendedKeyUsage', True, |
| 136 ('serverAuth,clientAuth,emailProtection,' | 134 ('serverAuth,clientAuth,emailProtection,' |
| 137 'timeStamping,msCodeInd,msCodeCom,msCTLSign,' | 135 'timeStamping,msCodeInd,msCodeCom,msCTLSign,' |
| 138 'msSGC,msEFS,nsSGC')), | 136 'msSGC,msEFS,nsSGC')), |
| 139 crypto.X509Extension('keyUsage', False, 'keyCertSign, cRLSign'), | 137 crypto.X509Extension('keyUsage', False, 'keyCertSign, cRLSign'), |
| 140 crypto.X509Extension('subjectKeyIdentifier', False, 'hash', | 138 crypto.X509Extension('subjectKeyIdentifier', False, 'hash', |
| 141 subject=ca_cert), | 139 subject=ca_cert), |
| 142 ]) | 140 ]) |
| 143 ca_cert.sign(key, 'sha256') | 141 ca_cert.sign(key, 'sha256') |
| 144 key_str = _dump_privatekey(key) | 142 key_str = _dump_privatekey(key) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 """Generates a cert_str with the sni field in server_cert_str signed by the | 221 """Generates a cert_str with the sni field in server_cert_str signed by the |
| 224 root_ca_cert_str. | 222 root_ca_cert_str. |
| 225 | 223 |
| 226 Args: | 224 Args: |
| 227 root_ca_cert_str: PEM formatted string representing the root cert | 225 root_ca_cert_str: PEM formatted string representing the root cert |
| 228 server_cert_str: PEM formatted string representing cert | 226 server_cert_str: PEM formatted string representing cert |
| 229 server_host: host name to use if there is no server_cert_str | 227 server_host: host name to use if there is no server_cert_str |
| 230 Returns: | 228 Returns: |
| 231 a PEM formatted certificate string | 229 a PEM formatted certificate string |
| 232 """ | 230 """ |
| 233 EXTENSION_WHITELIST = set(['subjectAltName']) | |
| 234 | |
| 235 if openssl_import_error: | 231 if openssl_import_error: |
| 236 raise openssl_import_error # pylint: disable=raising-bad-type | 232 raise openssl_import_error # pylint: disable=raising-bad-type |
| 237 | 233 |
| 238 common_name = server_host | 234 common_name = server_host |
| 239 reused_extensions = [] | |
| 240 if server_cert_str: | 235 if server_cert_str: |
| 241 original_cert = load_cert(server_cert_str) | 236 original_cert = load_cert(server_cert_str) |
| 242 common_name = original_cert.get_subject().commonName | 237 common_name = original_cert.get_subject().commonName |
| 243 for i in xrange(original_cert.get_extension_count()): | |
| 244 original_cert_extension = original_cert.get_extension(i) | |
| 245 if original_cert_extension.get_short_name() in EXTENSION_WHITELIST: | |
| 246 reused_extensions.append(original_cert_extension) | |
| 247 | 238 |
| 248 ca_cert = load_cert(root_ca_cert_str) | 239 ca_cert = load_cert(root_ca_cert_str) |
| 249 ca_key = load_privatekey(root_ca_cert_str) | 240 ca_key = load_privatekey(root_ca_cert_str) |
| 250 | 241 |
| 251 cert = crypto.X509() | 242 cert = crypto.X509() |
| 243 cert.set_version(2) |
| 252 cert.get_subject().CN = common_name | 244 cert.get_subject().CN = common_name |
| 253 cert.gmtime_adj_notBefore(-60 * 60) | 245 cert.gmtime_adj_notBefore(-60 * 60) |
| 254 cert.gmtime_adj_notAfter(60 * 60 * 24 * 30) | 246 cert.gmtime_adj_notAfter(60 * 60 * 24 * 30) |
| 255 cert.set_issuer(ca_cert.get_subject()) | 247 cert.set_issuer(ca_cert.get_subject()) |
| 256 cert.set_serial_number(int(time.time()*10000)) | 248 cert.set_serial_number(int(time.time()*10000)) |
| 257 cert.set_pubkey(ca_key) | 249 cert.set_pubkey(ca_key) |
| 258 cert.add_extensions(reused_extensions) | 250 cert.add_extensions([ |
| 251 crypto.X509Extension('subjectAltName', False, 'DNS:' + server_host), |
| 252 crypto.X509Extension('extendedKeyUsage', False, 'serverAuth,clientAuth'), |
| 253 ]) |
| 259 cert.sign(ca_key, 'sha256') | 254 cert.sign(ca_key, 'sha256') |
| 260 | 255 |
| 261 return _dump_cert(cert) | 256 return _dump_cert(cert) |
| 262 | 257 |
| 263 | 258 |
| 264 def install_cert_in_nssdb(home_directory_path, certificate_path): | 259 def install_cert_in_nssdb(home_directory_path, certificate_path): |
| 265 """Installs a certificate into the ~/.pki/nssdb database. | 260 """Installs a certificate into the ~/.pki/nssdb database. |
| 266 | 261 |
| 267 Args: | 262 Args: |
| 268 home_directory_path: Path of the home directory where to install | 263 home_directory_path: Path of the home directory where to install |
| (...skipping 11 matching lines...) Expand all Loading... |
| 280 cmd = ['certutil', '--empty-password', '-d', 'sql:' + cert_database_path] | 275 cmd = ['certutil', '--empty-password', '-d', 'sql:' + cert_database_path] |
| 281 cmd.extend(args) | 276 cmd.extend(args) |
| 282 logging.info(subprocess.list2cmdline(cmd)) | 277 logging.info(subprocess.list2cmdline(cmd)) |
| 283 subprocess.check_call(cmd) | 278 subprocess.check_call(cmd) |
| 284 | 279 |
| 285 if not os.path.isdir(cert_database_path): | 280 if not os.path.isdir(cert_database_path): |
| 286 os.makedirs(cert_database_path) | 281 os.makedirs(cert_database_path) |
| 287 certutil(['-N']) | 282 certutil(['-N']) |
| 288 | 283 |
| 289 certutil(['-A', '-t', 'PC,,', '-n', certificate_path, '-i', certificate_path]) | 284 certutil(['-A', '-t', 'PC,,', '-n', certificate_path, '-i', certificate_path]) |
| OLD | NEW |