可可熊的窝

Tag Archives: openssl

PHP中使用openssl

IN:Life   Tags: ,    Comments:2

服务器端要对客户端POST 上来的签名后的数据进行验证,本来想着用Python调用openssl命令行来实现,不过没有找到相关的命令,后来找了下PHP的openssl的封装,果然有的:http://php.chinaunix.net/manual/zh/ref.openssl.php

封装的函数也比较好用。(我还想着要是实在不行就用C语言写个CGI来调用openssl 了)

上面的代码中,首先从客户的证书中获取公钥,然后使用openssl_verify($data, $signature, $pubkeyid);对签名后的数据($signature)进行验证,$date为原始数据,$pubkeyid是从证书中读出的公钥,该函数还可以使用第四个参数,设置一个使用的hash算法,默认使用的是sha1。

被注释掉的代码是使用私钥对数据进行签名。

代码中第一行是获取原始的POST数据内容,也就是获取标准输入的数据。如果是Python写CGI的话可以使用:
data = sys.stdin.read()

代码见:http://code.google.com/p/cocobear/source/browse/trunk/openssl/openssl_php.php

在wordpress日志里加PHP代码一直出错,没办法,只能放在别的地方。

06-17
2009

Openssl建立SSL连接分析

IN:安全相关   Tags: ,    Comments:4

SSL_library_init();
SSL的初始化过程,只是添加一些算法,使用EVP_add_cipher函数。

ssl_method = SSLv3_client_method();
设置使用的SSL版本,SSLv3_client_method 函数的定义是通过IMPLEMENT_ssl3_meth_func(ssl/s3_clnt.c)这个宏来实现,而这个宏在ssl/ssl_locl.h 文件中实现,使用了粘贴宏的技巧来根据传入不同的函数名生成不同的函数定义。
SSLv3_client_method 定义了一组关于SSL V3的操作函数:

	static SSL_METHOD func_name##_data= {
		SSL3_VERSION,
		ssl3_new,
		ssl3_clear,
		ssl3_free,
		s_accept,
		s_connect,
		ssl3_read,
		ssl3_peek,
		ssl3_write,
		ssl3_shutdown,
		ssl3_renegotiate,
		ssl3_renegotiate_check,
		ssl3_get_message,
		ssl3_read_bytes,
		ssl3_write_bytes,
		ssl3_dispatch_alert,
		ssl3_ctrl,
		ssl3_ctx_ctrl,
		ssl3_get_cipher_by_char,
		ssl3_put_cipher_by_char,
		ssl3_pending,
		ssl3_num_ciphers,
		ssl3_get_cipher,
		s_get_meth,
		ssl3_default_timeout,
		&SSLv3_enc_data,
		ssl_undefined_void_function,
		ssl3_callback_ctrl,
		ssl3_ctx_callback_ctrl,
	};

SSL_CTX = SSL_CTX_new(ssl_method);
创建SSL_CTX这个结构体,进行初始化赋值操作,设置一些参数,使用默认的engine。openssl的engine是对基础的加密算法进行了封装,这样可以方便的对底层的加密算法进行替换,例如你可能使用硬件加密来替换掉openssl的软实现加密算法,而你所做的只是按照engine的接口实现相关的算法,然后设置engine的名字。例如U-KEY的RSA签名必须在硬件中完成,这时你就可以通过engine调用CSP来实现签名算法。

SSL_CTX_use_certificate_file(SSL_CTX,”client.cer”,SSL_FILETYPE_PEM)
设置客户端使用的证书,从文件中读取BASE64(SSL_FILETYPE_PEM这个参数指定)编码的证书,然后转换为openssl 的X509结构,提取公钥,设置SSL_CTX相关的结构。

SSL_CTX_use_PrivateKey_file(SSL_CTX, “client.key”, SSL_FILETYPE_PEM)
设置客户端使用的私钥,这种方式也是直接从文件中读取,更安全的方式是使用SSL_CTX_use_RSAPrivateKey(SSL_CTX, RSA),RSA是一个包含了RSA算法相关数据的结构体,这里定义了RSA算法相关的操作,在这里可以把私钥相关的算法操作使用自己的CSP来完成,而不是直接使用私钥完成。

SSL = SSL_new(SSL_CTX);
创建SSL 这个复杂的结构体。太多了,就不细说了。

SSL_set_fd(SSL, sock_fd);
设置连接使用的socket的fd,我们要做的socket操作只是得到这个fd,read,write操作将由openssl来完成。

SSL_connect(SSL);
这个函数将根据前面设置的SSL版本来进行相应的连接操作。

server_cert = SSL_get_peer_certificate(SSL);
得到服务器端的证书,下来可能要做一些服务器证书的验证,这里就省略了。

X509_free(server_cert);
SSL_write();
SSL_read();
接下来的操作就很好理解了.

http://code.google.com/p/cocobear/source/browse/trunk/openssl/openssl_test.cpp

上面写了一代简单的openssl进行HTTPS通信的代码,在Win和Linux下都可以运行,只是在socket操作有一点点的差异。

05-22
2009

SSL SSL2.0 SSL3.0 TLS 1.0

IN:互联网   Tags: ,    Comments:5

SSL是用于网络安全传输的协议,在TCP之上,HTTP之下。以前对标题里面这几个有点分不清楚,今天花了点时间整理下概念。

SSL为(Secure Sockets Layer)的缩写,是网景公司为网络安全传输制定的一套标准,SSL1.0没有公开发布过,所以SSL1.0可以无视之。SSL2.0在1995年发布,不过因为有很多的安全漏洞,所以SSL3.0很快在1996年就出现了。不过主流的浏览器在很长的一段时间内都在支持SSL2.0,IE6默认是支持SSL2.0的(IE7中SSL2.0被禁用了),Firefox2以后禁用了SSl2.0,Opera在8.5以后也禁用了SSL2.0。

IETF在1999年的时候以SSL3.0为基础,制定了TLS(Transport Layer Security) 1.0,RFC2246对TLS进行了详细的描述。TLS 1.0在框架上完全使用SSL3.0,只是在一些细节上有差异,比如采用的算法集,随机函数的产生,这里有一篇文章对TLS与SSL3.0区别进行了详细的描述。
由于TLS基本上是对SSL3.0的补充,因此在很多地方SSL3.0 TLS这两个名词被混合使用。

TLS也在更新,不过变化不大,RFC4346对TLS 1.1进行了详细描述。
TLS最新版本为1.2,相关的RFC为RFC5246

目前国内网站使用的HTTPS其本上都是基于SSL3.0的。

以下是wireshark抓包一个SSL3.0的通信过程:

client ————->server [Client Hello]
server ————>client [Server Hello]
server ————>client [Certificate]
client ————->server [Client Key Exchange , Change Cipher Spec, Encrypted Handshake Message
server ------------->client [Change Cipher Spec, Encrypted Handshake Message
client -------------->server [Application Data]

05-08
2009

Apache使用Openssl实现HTTPS访问

IN:互联网   Tags:    Comments:2

首先确认apache支持mod_ssl, openssl也正确安装。

Fedora 8中apache关于ssl的配置文件在/etc/httpd/conf.d/ssl.conf文件中,使用SSLEngine on选项来开启HTTPS的支持,apache默认会使用一个自带的localhost 的证书来进行HTTPS连接。

接下来我们使用openssl生成自己的证书进行HTTPS连接:

mkdir /etc/httpd/conf.d/ssl.crt/
cd /etc/httpd/conf.d/ssl.crt
(1)
生成服务器的私钥:
openssl rsa -in server.key -out server.key

openssl req -new -key server.key -out server.csr
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.

(2)
对客户端也使用同样的方式:
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr

(3)
生成CA中心的私钥:
openssl genrsa -out ca.key 1024
生成X509格式的CA证书:
openssl req -new -x509 -keyout ca.key -out ca.crt

(4)
用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
mkdir ../../CA
mkdir ../../CA/newcerts
touch ../../CA/serial
cat “01″ > ../../CA/serial
touch ../../CA/index.txt
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

(5)
生成浏览器使用的PFX格式的证书:
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
把ca.crt安装到信任的机构,client.pfx安装或安装到个人证书位置

(6)
编辑ssl.conf配置文件,修改证书相关的地方:
SSLCertificateFile /etc/httpd/conf.d/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl.crt/server.key
SSLCACertificateFile /etc/httpd/conf.d/ssl.crt/ca.crt

05-08
2009
loading...