zoukankan      html  css  js  c++  java
  • 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握手。
  • 相关阅读:
    绘图类
    画笔类
    创建模态,非模态对话框
    菜单类
    [WPF]程序随系统自启动
    [WPF]xml序列化以及反序列化数据
    [WPF]项目整合Metro和MaterialDesignInXamlToolkit UI框架
    [WPF]鼠标移动到Button颜色改变效果设置
    [Leetcode] 寻找数组的中心索引
    [Leetcode]在排序数组中查找元素的第一个和最后一个位置
  • 原文地址:https://www.cnblogs.com/aixiaoxiaoyu/p/8137676.html
Copyright © 2011-2022 走看看