Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/ssl_server_socket_openssl.h" | 5 #include "net/socket/ssl_server_socket_openssl.h" |
| 6 | 6 |
| 7 #include <openssl/err.h> | 7 #include <openssl/err.h> |
| 8 #include <openssl/ssl.h> | 8 #include <openssl/ssl.h> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "crypto/openssl_util.h" | 14 #include "crypto/openssl_util.h" |
| 15 #include "crypto/rsa_private_key.h" | 15 #include "crypto/rsa_private_key.h" |
| 16 #include "crypto/scoped_openssl_types.h" | 16 #include "crypto/scoped_openssl_types.h" |
| 17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 18 #include "net/cert/cert_verify_result.h" | 18 #include "net/cert/cert_verify_result.h" |
| 19 #include "net/cert/client_cert_verifier.h" | 19 #include "net/cert/client_cert_verifier.h" |
| 20 #include "net/cert/x509_util_openssl.h" | 20 #include "net/cert/x509_util_openssl.h" |
| 21 #include "net/ssl/openssl_ssl_util.h" | 21 #include "net/ssl/openssl_ssl_util.h" |
| 22 #include "net/ssl/scoped_openssl_types.h" | |
| 23 #include "net/ssl/ssl_connection_status_flags.h" | 22 #include "net/ssl/ssl_connection_status_flags.h" |
| 24 #include "net/ssl/ssl_info.h" | 23 #include "net/ssl/ssl_info.h" |
| 25 | 24 |
| 26 #define GotoState(s) next_handshake_state_ = s | 25 #define GotoState(s) next_handshake_state_ = s |
| 27 | 26 |
| 28 namespace net { | 27 namespace net { |
| 29 | 28 |
| 30 namespace { | 29 namespace { |
| 31 | 30 |
| 32 scoped_refptr<X509Certificate> CreateX509Certificate(X509* cert, | 31 scoped_refptr<X509Certificate> CreateX509Certificate(X509* cert, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 56 scoped_refptr<X509Certificate> GetClientCert(SSL* ssl) { | 55 scoped_refptr<X509Certificate> GetClientCert(SSL* ssl) { |
| 57 X509* cert = SSL_get_peer_certificate(ssl); | 56 X509* cert = SSL_get_peer_certificate(ssl); |
| 58 STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl); | 57 STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl); |
| 59 return CreateX509Certificate(cert, chain); | 58 return CreateX509Certificate(cert, chain); |
| 60 } | 59 } |
| 61 | 60 |
| 62 void DoNothingOnCompletion(int ignore) {} | 61 void DoNothingOnCompletion(int ignore) {} |
| 63 | 62 |
| 64 } // namespace | 63 } // namespace |
| 65 | 64 |
| 65 scoped_ptr<SSLServerSocketContext> CreateSSLServerSocketContext( | |
| 66 X509Certificate* certificate, | |
| 67 const crypto::RSAPrivateKey& key, | |
| 68 const SSLServerConfig& ssl_server_config) { | |
| 69 crypto::EnsureOpenSSLInit(); | |
| 70 return scoped_ptr<SSLServerSocketContext>( | |
| 71 new SSLServerSocketContextOpenSSL(certificate, key, ssl_server_config)); | |
| 72 } | |
| 73 | |
| 66 void EnableSSLServerSockets() { | 74 void EnableSSLServerSockets() { |
| 67 // No-op because CreateSSLServerSocket() calls crypto::EnsureOpenSSLInit(). | 75 // No-op because CreateSSLServerSocket() calls crypto::EnsureOpenSSLInit(). |
| 68 } | 76 } |
| 69 | 77 |
| 70 scoped_ptr<SSLServerSocket> CreateSSLServerSocket( | 78 SSLServerSocketContextOpenSSL::SSLServerSocketContextOpenSSL( |
| 71 scoped_ptr<StreamSocket> socket, | 79 scoped_refptr<X509Certificate> certificate, |
| 72 X509Certificate* certificate, | |
| 73 const crypto::RSAPrivateKey& key, | 80 const crypto::RSAPrivateKey& key, |
| 74 const SSLServerConfig& ssl_server_config) { | 81 const SSLServerConfig& ssl_server_config) |
| 82 : ssl_ctx_(SSL_CTX_new(SSLv23_server_method())), | |
|
davidben
2016/01/22 23:57:48
Nit: It's the same thing, but this ought to be TLS
ryanchung
2016/01/29 23:28:15
Done.
| |
| 83 ssl_server_config_(ssl_server_config), | |
| 84 cert_(certificate), | |
| 85 key_(key.Copy()) { | |
| 86 SSL_CTX_set_session_cache_mode(ssl_ctx_.get(), SSL_SESS_CACHE_SERVER); | |
| 87 int session_ctx_id = 0; | |
| 88 SSL_CTX_set_session_id_context( | |
| 89 ssl_ctx_.get(), (unsigned char*)&session_ctx_id, sizeof(session_ctx_id)); | |
|
davidben
2016/01/22 23:57:48
unsigned char -> uint8_t. Also C++-style casts. Bu
ryanchung
2016/01/29 23:28:15
Done.
| |
| 90 | |
| 91 if (ssl_server_config_.require_client_cert) { | |
| 92 SSL_CTX_set_verify(ssl_ctx_.get(), | |
| 93 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | |
| 94 } | |
| 95 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), | |
| 96 SSLServerSocketOpenSSL::CertVerifyCallback, | |
| 97 ssl_server_config_.client_cert_verifier); | |
| 98 CHECK(key_); | |
|
davidben
2016/01/22 23:57:48
This probably should be the first line.
ryanchung
2016/01/29 23:28:16
Done.
| |
| 99 } | |
| 100 | |
| 101 SSLServerSocketContextOpenSSL::~SSLServerSocketContextOpenSSL() {} | |
| 102 | |
| 103 scoped_ptr<SSLServerSocket> | |
| 104 SSLServerSocketContextOpenSSL::CreateSSLServerSocket( | |
| 105 scoped_ptr<StreamSocket> socket) { | |
| 75 crypto::EnsureOpenSSLInit(); | 106 crypto::EnsureOpenSSLInit(); |
| 107 SSL* ssl = SSL_new(ssl_ctx_.get()); | |
| 76 return scoped_ptr<SSLServerSocket>(new SSLServerSocketOpenSSL( | 108 return scoped_ptr<SSLServerSocket>(new SSLServerSocketOpenSSL( |
| 77 std::move(socket), certificate, key, ssl_server_config)); | 109 std::move(socket), cert_.get(), *key_, ssl_server_config_, ssl)); |
| 78 } | 110 } |
| 79 | 111 |
| 80 SSLServerSocketOpenSSL::SSLServerSocketOpenSSL( | 112 SSLServerSocketOpenSSL::SSLServerSocketOpenSSL( |
| 81 scoped_ptr<StreamSocket> transport_socket, | 113 scoped_ptr<StreamSocket> transport_socket, |
| 82 scoped_refptr<X509Certificate> certificate, | 114 scoped_refptr<X509Certificate> certificate, |
| 83 const crypto::RSAPrivateKey& key, | 115 const crypto::RSAPrivateKey& key, |
| 84 const SSLServerConfig& ssl_server_config) | 116 const SSLServerConfig& ssl_server_config, |
| 117 SSL* ssl) | |
| 85 : transport_send_busy_(false), | 118 : transport_send_busy_(false), |
| 86 transport_recv_busy_(false), | 119 transport_recv_busy_(false), |
| 87 transport_recv_eof_(false), | 120 transport_recv_eof_(false), |
| 88 user_read_buf_len_(0), | 121 user_read_buf_len_(0), |
| 89 user_write_buf_len_(0), | 122 user_write_buf_len_(0), |
| 90 transport_write_error_(OK), | 123 transport_write_error_(OK), |
| 91 ssl_(NULL), | 124 ssl_(ssl), |
| 92 transport_bio_(NULL), | 125 transport_bio_(NULL), |
| 93 transport_socket_(std::move(transport_socket)), | 126 transport_socket_(std::move(transport_socket)), |
| 94 ssl_server_config_(ssl_server_config), | 127 ssl_server_config_(ssl_server_config), |
| 95 cert_(certificate), | 128 cert_(certificate), |
| 96 key_(key.Copy()), | 129 key_(key.Copy()), |
| 97 next_handshake_state_(STATE_NONE), | 130 next_handshake_state_(STATE_NONE), |
| 98 completed_handshake_(false) { | 131 completed_handshake_(false) { |
| 99 CHECK(key_); | 132 CHECK(key_); |
| 100 } | 133 } |
| 101 | 134 |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 674 void SSLServerSocketOpenSSL::DoWriteCallback(int rv) { | 707 void SSLServerSocketOpenSSL::DoWriteCallback(int rv) { |
| 675 DCHECK(rv != ERR_IO_PENDING); | 708 DCHECK(rv != ERR_IO_PENDING); |
| 676 DCHECK(!user_write_callback_.is_null()); | 709 DCHECK(!user_write_callback_.is_null()); |
| 677 | 710 |
| 678 user_write_buf_ = NULL; | 711 user_write_buf_ = NULL; |
| 679 user_write_buf_len_ = 0; | 712 user_write_buf_len_ = 0; |
| 680 ResetAndReturn(&user_write_callback_).Run(rv); | 713 ResetAndReturn(&user_write_callback_).Run(rv); |
| 681 } | 714 } |
| 682 | 715 |
| 683 int SSLServerSocketOpenSSL::Init() { | 716 int SSLServerSocketOpenSSL::Init() { |
| 684 DCHECK(!ssl_); | |
| 685 DCHECK(!transport_bio_); | 717 DCHECK(!transport_bio_); |
| 686 | 718 |
| 687 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 719 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 688 | 720 |
| 689 ScopedSSL_CTX ssl_ctx(SSL_CTX_new(SSLv23_server_method())); | |
| 690 if (ssl_server_config_.require_client_cert) { | |
| 691 SSL_CTX_set_verify(ssl_ctx.get(), | |
| 692 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | |
| 693 } | |
| 694 SSL_CTX_set_cert_verify_callback(ssl_ctx.get(), CertVerifyCallback, | |
| 695 ssl_server_config_.client_cert_verifier); | |
| 696 ssl_ = SSL_new(ssl_ctx.get()); | |
| 697 if (!ssl_) | 721 if (!ssl_) |
| 698 return ERR_UNEXPECTED; | 722 return ERR_UNEXPECTED; |
| 699 | 723 |
| 700 BIO* ssl_bio = NULL; | 724 BIO* ssl_bio = NULL; |
| 701 // 0 => use default buffer sizes. | 725 // 0 => use default buffer sizes. |
| 702 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) | 726 if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0)) |
| 703 return ERR_UNEXPECTED; | 727 return ERR_UNEXPECTED; |
| 704 DCHECK(ssl_bio); | 728 DCHECK(ssl_bio); |
| 705 DCHECK(transport_bio_); | 729 DCHECK(transport_bio_); |
| 706 | 730 |
| 707 SSL_set_bio(ssl_, ssl_bio, ssl_bio); | 731 SSL_set_bio(ssl_, ssl_bio, ssl_bio); |
| 708 | 732 |
| 709 // Set certificate and private key. | 733 // Set certificate and private key. |
|
davidben
2016/01/22 23:57:48
Just about everything from hear onwards should be
ryanchung
2016/01/29 23:28:16
Done. I moved the configuration steps to the const
| |
| 710 DCHECK(cert_->os_cert_handle()); | 734 DCHECK(cert_->os_cert_handle()); |
| 711 #if defined(USE_OPENSSL_CERTS) | 735 #if defined(USE_OPENSSL_CERTS) |
| 712 if (SSL_use_certificate(ssl_, cert_->os_cert_handle()) != 1) { | 736 if (SSL_use_certificate(ssl_, cert_->os_cert_handle()) != 1) { |
| 713 LOG(ERROR) << "Cannot set certificate."; | 737 LOG(ERROR) << "Cannot set certificate."; |
| 714 return ERR_UNEXPECTED; | 738 return ERR_UNEXPECTED; |
| 715 } | 739 } |
| 716 #else | 740 #else |
| 717 // Convert OSCertHandle to X509 structure. | 741 // Convert OSCertHandle to X509 structure. |
| 718 std::string der_string; | 742 std::string der_string; |
| 719 if (!X509Certificate::GetDEREncoded(cert_->os_cert_handle(), &der_string)) | 743 if (!X509Certificate::GetDEREncoded(cert_->os_cert_handle(), &der_string)) |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 741 | 765 |
| 742 DCHECK_LT(SSL3_VERSION, ssl_server_config_.version_min); | 766 DCHECK_LT(SSL3_VERSION, ssl_server_config_.version_min); |
| 743 DCHECK_LT(SSL3_VERSION, ssl_server_config_.version_max); | 767 DCHECK_LT(SSL3_VERSION, ssl_server_config_.version_max); |
| 744 SSL_set_min_version(ssl_, ssl_server_config_.version_min); | 768 SSL_set_min_version(ssl_, ssl_server_config_.version_min); |
| 745 SSL_set_max_version(ssl_, ssl_server_config_.version_max); | 769 SSL_set_max_version(ssl_, ssl_server_config_.version_max); |
| 746 | 770 |
| 747 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, | 771 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, |
| 748 // set everything we care about to an absolute value. | 772 // set everything we care about to an absolute value. |
| 749 SslSetClearMask options; | 773 SslSetClearMask options; |
| 750 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); | 774 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); |
| 775 options.ConfigureFlag(SSL_OP_NO_TICKET, true); | |
|
davidben
2016/01/22 23:57:48
Why turn off tickets? I can't think of any reason
ryanchung
2016/01/29 23:28:15
Done. Should not be turned off. Line removed.
| |
| 751 | 776 |
| 752 SSL_set_options(ssl_, options.set_mask); | 777 SSL_set_options(ssl_, options.set_mask); |
| 753 SSL_clear_options(ssl_, options.clear_mask); | 778 SSL_clear_options(ssl_, options.clear_mask); |
| 754 | 779 |
| 755 // Same as above, this time for the SSL mode. | 780 // Same as above, this time for the SSL mode. |
| 756 SslSetClearMask mode; | 781 SslSetClearMask mode; |
| 757 | 782 |
| 758 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true); | 783 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true); |
| 759 | 784 |
| 760 SSL_set_mode(ssl_, mode.set_mask); | 785 SSL_set_mode(ssl_, mode.set_mask); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 818 int res = verifier->Verify(client_cert.get(), | 843 int res = verifier->Verify(client_cert.get(), |
| 819 base::Bind(&DoNothingOnCompletion), &ignore_async); | 844 base::Bind(&DoNothingOnCompletion), &ignore_async); |
| 820 if (res != OK) { | 845 if (res != OK) { |
| 821 X509_STORE_CTX_set_error(store_ctx, X509_V_ERR_CERT_REJECTED); | 846 X509_STORE_CTX_set_error(store_ctx, X509_V_ERR_CERT_REJECTED); |
| 822 return 0; | 847 return 0; |
| 823 } | 848 } |
| 824 return 1; | 849 return 1; |
| 825 } | 850 } |
| 826 | 851 |
| 827 } // namespace net | 852 } // namespace net |
| OLD | NEW |