05.SSL或TTL应用编程

5.1 Programming with SSL
从这一点上,我们将弥合差距到更高级的OpenSSL功能。 本章的目的是将图书馆的特征分成较小的群体,以建立一个过程的感觉。 我们希望这个过程可以作为开发者在自己的应用中实现SSL的模板。 在将SSL添加到应用程序中时,必须考虑应用程序的独特要求,并且必须对安全性和功能性做出最佳决策。
 
以下步骤为开发人员在实施SSL客户端或服务器时提供了一个模板。 我们将从一个小例子开始,并以此为基础。 直到所有的步骤都被认真考虑,这个例子对我们的满意是不安全的。 在每一步中,我们将介绍一小剂量的API; 在所有步骤之后,开发人员应该能够更清楚地思考启用SSL的应用程序的设计。 然而,完成这些步骤并不是路的尽头。 为了解决许多应用程序的需求,我们需要进一步研究API的高级功能。
 
5.1.2.1 Background
Function 
Comments
SSLv2_method 
Returns a pointer to SSL_METHOD for generic SSL Version 2
SSLv2_client_method 
Returns a pointer to SSL_METHOD for an SSL Version 2 client
SSLv2_server_method 
Returns a pointer to SSL_METHOD for an SSL Version 2 server
SSLv3_method 
Returns a pointer to SSL_METHOD for generic SSL Version 3
SSLv3_client_method 
Returns a pointer to SSL_METHOD for an SSL Version 3 client
SSLv3_server_method 
Returns a pointer to SSL_METHOD for an SSL Version 3 server
TLSv1_method 
Returns a pointer to SSL_METHOD for generic TLS Version 1
TLSv1_client_method 
Returns a pointer to SSL_METHOD for a TLS Version 1 client
TLSv1_server_method 
Returns a pointer to SSL_METHOD for a TLS Version 1 server
SSLv23_method 
Returns a pointer to SSL_METHOD for generic SSL/TLS
SSLv23_client_method 
Returns a pointer to SSL_METHOD for an SSL/TLS client
SSLv23_server_method 
Returns a pointer to SSL_METHOD for an SSL/TLS server
 
 
通常,服务器应用程序应始终向对等方提供证书,客户端可以选择这样做。 应用程序的目的和期望的安全性应决定是否使用客户端证书。OpenSSL在握手期间向客户端提交客户端证书,只要我们为客户端分配证书,服务器请求客户端证书。
 
函数
 
int passwd_cb(char * buf, int size, int flag, void *userdata);
功能
回调函数的义务是将密码复制到调用时提供给它的缓冲区中。
回调函数用四个参数调用。
参数
 
 
buf
密码应该被复制到的缓冲区。
 
size
缓冲区的大小(以字节为单位)
 
flag
通过为零或非零。 当该标志不为零时,该密码将用于执行加密; 否则,它将被用来执行解密。
userdata
被SSL_CTX_set_default_passwd_cb_userdata使用
 
 
Generating the Files Needed by the Examples
a.To create the root CA:
$openssl req -newkey rsa:1024 -sha1 -keyout rootkey.pem -out rootreq.pem
$ openssl x509 -req -in rootreq.pem -sha1 -extfile myopenssl.cnf > -extensions v3_ca -signkey rootkey.pem -out rootcert.pem
$ cat rootcert.pem rootkey.pem > root.pem
$ openssl x509 -subject -issuer -noout -in root.pem
subject= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=Root CA
issuer= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=Root CA
 
b.To create the server CA and sign it with the root CA:
$ openssl req -newkey rsa:1024 -sha1 -keyout serverCAkey.pem -out > serverCAreq.pem
 
$ openssl x509 -req -in serverCAreq.pem -sha1 -extfile > myopenssl.cnf -extensions v3_ca -CA root.pem -CAkey root.pem > -CAcreateserial -out serverCAcert.pem
 
$ cat serverCAcert.pem serverCAkey.pem rootcert.pem > serverCA.pem
 
$ openssl x509 -subject -issuer -noout -in serverCA.pem
subject= /C=US/ST=VA/L=Fairfax/O=Zork.org/OU=Server
Division/CN=Server CA
issuer= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=Root CA
 
 
c.To create the server's certificate and sign it with the Server CA
$ openssl req -newkey rsa:1024 -sha1 -keyout serverkey.pem -out > serverreq.pem
$ openssl x509 -req -in serverreq.pem -sha1 -extfile myopenssl.cnf > -extensions usr_cert -CA serverCA.pem -CAkey serverCA.pem > -CAcreateserial -out servercert.pem
$ cat servercert.pem serverkey.pem serverCAcert.pem rootcert.pem > > server.pem
$ openssl x509 -subject -issuer -noout -in server.pem
subject= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=splat.zork.org
issuer= /C=US/ST=VA/L=Fairfax/O=Zork.org/OU=Server
Division/CN=Server CA
 
 
d.To create the client certificate and sign it with the Root CA
$ openssl req -newkey rsa:1024 -sha1 -keyout clientkey.pem -out > clientreq.pem
$ openssl x509 -req -in clientreq.pem -sha1 -extfile myopenssl.cnf > -extensions usr_cert -CA root.pem -CAkey root.pem > -CAcreateserial -out clientcert.pem
$ cat clientcert.pem clientkey.pem rootcert.pem > client.pem
$ openssl x509 -subject -issuer -noout -in client.pem
subject= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=shell.zork.org
issuer= /C=US/ST=VA/L=Fairfax/O=Zork.org/CN=Root CA
 
e.To create dh512.pem and dh1024.pem:
$ openssl dhparam -check -text -5 512 -out dh512.pem
$ openssl dhparam -check -text -5 1024 -out dh1024.pem
 
 
5.1.3 Step 2: Peer Authentication
启用SSL的程序的安全性由于未能正确验证对等证书而受到损害。 在这一步中,我们将研究处理可信证书,证书链验证,CRL使用和连接后验证的各种API调用。
 
 
函数
 
 
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,const char *CApath);
 
功能
将可信任的CA证书加载到我们的应用程序中,作为附加设置
SSL_CTX对象。
参数
 
 
ctx
可信CA证书的SSL上下文对象将被加载到。
 
CAfile
 
包含PEM格式的CA证书的文件的名称。 文件中可能存在多个CA证书。
 
 
CApath
包含CA证书的目录的名称。
备注
 
We can call SSL_CTX_load_verify_locations with either the second or the third
arguments specified as NULL, but not both.
 
下载CA证书使用
SSL_CTX_set_default_verify_paths和 SSL_CTX_load_verify_locations函数
 
 
5.1.3.3 Certificate verification
SSL_CTX_set_verify
参数
功能
 
SSL_VERIFY_NONE
在服务器模式下使用上下文时,不会向客户端发送证书请求,客户端也不应发送证书。
 
SSL_VERIFY_PEER
在服务器模式下使用上下文时,将向客户端发送证书请求。
 
SSL_VERIFY_FAIL_IF_NO_PEER_CERT
如果上下文未在服务器模式下使用,或者SSL_VERIFY_PEER未设置,则忽略此标志。
 
SSL_VERIFY_CLIENT_ONCE
如果上下文未在服务器模式下使用,或者SSL_VERIFY_PEER未设置,则忽略此标志。
 
 
 
X509_STORE *SSL_CTX_get_cert_store(SSL_CTX *ctx);
 
 
SSL_get_verify_result
我们将在我们的连接后检查中使用。
 
SSL_get_peer_certificate
函数SSL_get_peer_certificate将返回一个指向X509对象的指针
包含同行的证书
 
5.1.4 Step 3: SSL Options and Cipher Suites
   
 
SSL_CTX_set_options
SSL_CTX_set_options函数为开发人员提供了对从上下文产生的SSL连接的更好控制。
 
SSL_CTX_set_verify
 
 
5.2.1 SSL Session Caching
SSL会话与SSL连接不同。 会话是指通过执行握手而创建的一组参数和加密密钥,而连接是使用会话的活动会话。 换言之,连接是指通信的过程,而会话是指通信所建立的参数。 了解这一点,我们可以深入研究一些提供SSL会话缓存的OpenSSL例程。
 
业务流程:
 
SSL_get_session
 
 
SSL_get0_session
 
 
SSL_get1_session
 
 
PEM_write_bio_SSL_SESSION
 
 
PEM_read_bio_SSL_SESSION
 
 
SSL_set_session
 
 
SSL_connect
 
 
SSL_SESSION_free
 
 
5.2.1.3 An on-disk, session caching framework
函数
 
int new_session_cb(SSL *ctx, SSL_SESSION *session);
 
功能
无论何时由SSL_CTX对象创建新的SSL_SESSION,都会调用由SSL_CTX_sess_set_new_cb设置的回调。...
参数
意义
ctx
SSL连接的连接对象。
session
新创建的会话对象
 
 
函数
 
 
void remove_session_cb(SSL_CTX *ctx, SSL_SESSION *session);
 
 
功能
破坏会话层对象
参数
意义
ctx
SSL连接的连接对象。
session
新创建的会话对象
 
 
 
函数
SSL_SESSION *get_session_cb(SSL *ctx, unsigned char *id, int len, int* ref);
 
功能
SSL_CTX_sess_set_get_cb函数用于设置缓存检索回调。
参数
意义
ctx
SSL连接的连接对象。
id
对方请求的会话ID。
len
会话ID的长度。
ref
来自回调的输出。
 
Table 5-3. Some common return values of SSL_get_error
 
Return value
Description
SSL_ERROR_NONE
No error occurred with the I/O call.
SSL_ERROR_ZERO_RETURN
The operation failed due to the SSL session being closed. The
underlying connection medium may still be open.
SSL_ERROR_WANT_READ
The operation couldn't be completed. The underlying medium
could not fulfill the read requested. This error code means the
call should be retried.
SSL_ERROR_WANT_WRITE
The operation couldn't be completed. The underlying medium
could not fulfill the write requested. This error code means the
call should be retried.
 
5.2.2.3 Non-blocking I/O
 
 
5.2.3 SSL Renegotiations
SSL重新协商本质上是一个连接期间的SSL握手。
posted @ 2017-12-28 20:42  艾小小雨  阅读(549)  评论(0编辑  收藏  举报