三
:
需要了解的一些函数
:
1.int SSL_CTX_set_cipher_list(SSL_CTX *,const char *str);
根据
SSL/TLS
规范
,
在
ClientHello
中
,
客户端会提交一份自己能够支持的加密方法的列表
,
由服务端选择一种方法后在
ServerHello
中通知服务端
,
从而完成加密算法的协商
.
可用的算法为
:
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DES-CBC3-SHA
DHE-DSS-RC4-SHA
IDEA-CBC-SHA
RC4-SHA
RC4-MD5
EXP1024-DHE-DSS-RC4-SHA
EXP1024-RC4-SHA
EXP1024-DHE-DSS-DES-CBC-SHA
EXP1024-DES-CBC-SHA
EXP1024-RC2-CBC-MD5
EXP1024-RC4-MD5
EDH-RSA-DES-CBC-SHA
EDH-DSS-DES-CBC-SHA
DES-CBC-SHA
EXP-EDH-RSA-DES-CBC-SHA
EXP-EDH-DSS-DES-CBC-SHA
EXP-DES-CBC-SHA
EXP-RC2-CBC-MD5
EXP-RC4-MD5
这些算法按一定优先级排列
,
如果不作任何指定
,
将选用
DES-CBC3-SHA.
用
SSL_CTX_set_cipher_list
可以指定自己希望用的算法
(
实际上只是
提高其优先级
,
是否能使用还要看对方是否支持
).
我们在程序中选用了
RC4
做加密
,MD5
做消息摘要
(
先进行
MD5
运算
,
后进行
RC4
加密
).
即
SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
在消息传输过程中采用对称加密
(
比公钥加密在速度上有极大的提高
),
其所用秘钥
(shared secret)
在握手过程中中协商
(
每次对话过程均不同
,
在一次对话中都有可能有几次改变
),
并通过公钥加密的手段由客户端提交服务端
.
2.void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int (*callback)(int, X509_STORE_CTX *));
SSL_VERIFY_NONE,
如果想要验证对方的话
便要将此项变成
SSL_VERIFY_PEER.SSL/TLS
中缺省只验证
server,
如果没有设置
SSL_VERIFY_PEER
客户端连证书都不会发过来
.
3.int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,const char *CApath);
要验证对方的话
当然装要有
此函数用来便是加载
的证书文件的
.
4.int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
加载自己的证书文件
.
5.int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
加载自己的私钥
以用于签名
.
6.int SSL_CTX_check_private_key(SSL_CTX *ctx);
调用了以上两个函数后
自己检验一下证书与私钥是否配对
.
7.void RAND_seed(const void *buf,int num);
win32
client
程序运行时出错
(SSL_connect
的一个主要机制便是与
平台下的随机数生成机制不同
握手的时候用的到
具体描述可见
mod_ssl
解决办法就是调用此函数
应该为一随机的字符串
"seed".
还可以采用一下两个函数
:
void RAND_screen(void);
int RAND_event(UINT, WPARAM, LPARAM);
RAND_screen()
以屏幕内容作为
"seed"
产生随机数
,RAND_event
windows
(event),
以此为基础产生随机数
如果一直有
用户干预的话
用这种办法产生的随机数能够
但如果机器一直没人理
如总停在登录画面
则每次都将产生同样的数字
这几个函数都只在
WIN32
环境下编译时有用
下就不必调了
大量其他的相关函数原型
crypto/rand/rand.h.
8.OpenSSL_add_ssl_algorithms()
SSLeay_add_ssl_algorithms()
其实都是调用
int SSL_library_init(void)
进行一些必要的初始化工作
openssl
SSL/TLS
程序的话第一句便应是它
.
9.void SSL_load_error_strings(void );
如果想打印出一些方便阅读的调试信息的话
便要在一开始调用此函数
.
10.void ERR_print_errors_fp(FILE *fp);
如果调用了
SSL_load_error_strings()
便可以随时用
ERR_print_errors_fp()
来打印错误信息了
.
11.X509 *SSL_get_peer_certificate(SSL *s);
握手完成后
便可以用此函数从
结构中提取出对方的证书
此时证书得到且已经验证过了
.
12.X509_NAME *X509_get_subject_name(X509 *a);
得到证书所有者的名字
参数可用通过
SSL_get_peer_certificate()
.
13.X509_NAME *X509_get_issuer_name(X509 *a)
得到证书签署者
参数可用通过
SSL_get_peer_certificate()
.
14.char *X509_NAME_oneline(X509_NAME *a,char *buf,int size);
将以上两个函数得到的对象变成字符型
以便打印出来
.
15.SSL_METHOD
的构造函数
SSL_METHOD *TLSv1_server_method(void); /* TLSv1.0 */
SSL_METHOD *TLSv1_client_method(void); /* TLSv1.0 */
SSL_METHOD *SSLv2_server_method(void); /* SSLv2 */
SSL_METHOD *SSLv2_client_method(void); /* SSLv2 */
SSL_METHOD *SSLv3_server_method(void); /* SSLv3 */
SSL_METHOD *SSLv3_client_method(void); /* SSLv3 */
SSL_METHOD *SSLv23_server_method(void); /* SSLv3 but can rollback to v2 */
SSL_METHOD *SSLv23_client_method(void); /* SSLv3 but can rollback to v2 */
在程序中究竟采用哪一种协议
(TLSv1/SSLv2/SSLv3),
就看调哪一组构造函数了
libuv-
tls
使用
OpenSSL
在libuv之上添加
SSL
/
TLS
功能。
这个小型图书馆在libuv上使用BIO对添加了
SSL
/
TLS
功能。 它尝试提供与libuv类似的API,但几乎没有任何变化。 它还尝试使用
OpenSSL
提供的功能。 目前,它仅会刮擦BIO对。 随着我们对
OpenSSL
和libuv的了解越来越多,这可能会消失。
编写
我们自己的自定义BIO将带来更大的灵活性。
如果可以尽快完成,我们打算将该库作为libuv的子部分提供。
添加会话恢复功能-可能是更高版本
重新协商尚未处理-可能是更高版本
致力于支持D
TLS
支持-更高版本
从事建筑和包装工作
用法和API
libuv-
tls
具有与libuv相似的API。 任何libuv用户可以方便地使用在看的API uv
py
OpenSSL
-一个围绕
OpenSSL
库的Python包装器
注意: Python密码管理局强烈建议在可能的情况下使用 。 如果您使用py
OpenSSL
进行除建立
TLS
连接以外的任何操作,则应转到加密方法并删除py
OpenSSL
依赖项。
围绕
OpenSSL
库的子集的高级包装。 包括
SSL
.Connection对象,包装Python的可移植套接字的方法
用Python
编写
的回调
广泛的错误处理机制,镜像
OpenSSL
的错误代码
... 以及更多。
您可以在找到更多信息。 开发在。
如果您遇到错误,可以将其提交到我们的。
我们为用户和开发讨论维护了一个邮件列表。
您也可以在Freenode上加入#cryptography-dev来提问或参与。
nginx配置
ssl
报错:
查了nginx官方更新日志发现,
ssl
指令在1.15.0版本之后已经弃用,在1.15.0版本之后作为listen 的参数进行使用。使用方法: listen 443
ssl
;
去掉
ssl
on; 使用listen 443
ssl
;后问题解决。
SSL
的优点
(1)提供较高的安全性保证。
SSL
利用数据加密、身份验证和消息完整性验证机制,保证数据传输的安全性。
(2)支持各种应用层协议。虽然
SSL
设计的初衷是为了解决Web安全性问题,但是由于
SSL
位于应用层和传输层之间,它可以为任何基于TCP等可靠连接的应用层协议提供安全性保证。
(3)部署简单。目前
SSL
己经成为网络中用来鉴别
一个加密套件指明了
SSL
握手阶段和通信阶段所应该采用的各种算法。这些算法包括:认证算法、密钥交换算法、对称算法和摘要算法等。
在握手初始化的时候,双方都会导入各自所认可的多种加密套件。在握手阶段,由服务端选择其中的一种加密套件。
OpenSSL
的ciphers命令可以列出所有的加密套件。
openssl
的加密套件在s3_lib.c 的
ssl
3_ciphers数组中定义。比如有:
客户端
程序
代码:
//client #include #include #include #include "
openssl
/x509.h" #include "
openssl
/
ssl
.h" #include "
openssl
/err.h" #include "
openssl
/rand.h" #define PORT 1111 #define SERVER
我正在
编写
用于通信的
SSL
服务器和客户端。 我有以下服务器代码
SSL
_CTX* InitServerCTX(void){
SSL
_METHOD *method;
SSL
_CTX *ctx;
SSL
_library_init();
OpenSSL
_add_all_algorithms(); /* load & register all cryptos, etc. */
SSL
_load...
1.1 看到这个报错都知道啥意思:
网上查询有说需要换证书的,但是这是我自己建的私有CA,重新创建几次也没有报错
[root@centos8 /apps/nginx]#nginx -t
nginx: [emerg]
SSL
_CTX_use_PrivateKey("/apps/nginx/certs/www.xlj.org.key") failed (
SSL
: error:0B080074:x509 certificate routines:X509_check_private_key:key va
31.1 概述
SSL
协议最先由netscape公司提出,包括
ssl
v2和
ssl
v3两个版本。当前形成标准为
tls
协议(rfc2246规范)和D
TLS
(rfc4347,用于支持UDP协议)。
ssl
v3和
tls
协议大致一样。
SSL
协议能够保证通信双方的信道安全。他能提供数据加密、身份验证以及消息完整性保护。
SSL
协议通过客户端和服务端握手来协商各种算法和密钥。31.2
openssl
实现SS...
1、首先在打开宏USE_CYA
SSL
,在simple_http.h头文件定义 #define USE_CYA
SSL
2、在simple_http.c 文件包含自己的头文件,因为https接口函数都在此文件中
#include "simple_http.h"
#ifdef USE_CYA
SSL
#includ
学习如何使用
OpenSSL
—— 用于安全通信的最著名的开放库 —— 的 API 有些强人所难,因为其文档并不完全。您可以通过本文中的提示补充这方面的知识,并驾驭该 API。在建立基本的连接之后,就可以查看如何使用
OpenSSL
的 BIO 库来建立安全连接和非安全连接。与此同时,您还会学到一些关于错误检测的知识。
OpenSSL
API 的文档有些含糊不清。因为还没有多少关于 OpenSS
最近工作涉及到https,需要修改nginx的
openssl
模块,引入keyless方案。关于keyless可以参考CloudFlare的官方博客:
https://blog.cloudflare.com/keyless-
ssl
-the-nitty-gritty-technical-details/?utm_source=tuicool&utm_medium=referral。
在
openssl
的基础上修改私钥校验过程,因此需要对
openssl
的认证认证流程需要熟悉一下。
SSL