最近利用php开发ssl的相关功能,由于第一次做相关的事情,遇到了很多问题,庆幸的是最终都顺利解决了。不过相关的资料很少,都是综合了国内外的相关信息才解决的。现在整理一下,方便后来者遇到问题时解决。
1. 首先扫下盲,什么是数字签名
推荐一个通俗易懂的教程:中文版 英文版
其实整个过程就是:
数据->hash-》摘要-》私钥对摘要加密-》数字签名
 |                                      |
hash                                公钥解密
 |                                      |
摘要-------------是否相等--------------摘要

2. Fatal error: Call to undefined function openssl_pkey_get_public() in 。。。

这个问题主要是因为php.ini中,extension=php_openssl.dll的选项没有打开,把分号去掉,重启apache即可。
3. 用php的openssl_verify函数无法验证由其他函数库生成的签名
比如用c++的函数库生成了一个签名,将其发送给服务器端验签,用php的openssl_verify函数,总是无法通过,并且有以下错误提示:
error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long
error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header
error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
主要原因是openssl_verify函数是对上面讲的验签过程的高度封装,包括公钥解密,数据校验,比较摘要等过程。这个函数的特别之处是,它需要这个签名必须包含hash头,而有些函数生成的签名是不包含这个hash头的,所以总是有参数错误。
解决的办法就是自己实现这个verify函数。简单的过程如下:
$sha1 = sha1($data, true);
$sign = base64_decode($sign);
$deco = '';
$pubkid = openssl_pkey_get_public($cert);
openssl_public_decrypt($sign, $deco, $pubkid);
最后比较$sha1和$deco是否相等。
4.Warning: openssl_verify(): Don't know how to get public key from this private key in。。。

Warning: openssl_verify(): supplied key param cannot be coerced into a public key in。。。

Warning: openssl_public_decrypt(): Don't know how to get public key from this private key in。。。
Warning: openssl_public_decrypt(): key parameter is not a valid public key in 。。。
明明各种配置都正确,为什么会有这样的警告?而且函数无法得到正确结果。
这个原因是apache和php的openssl版本不一致。apache和php的openssl功能都依赖于libeay32.dll和 ssleay32.dll这两个库,但是这两个文件并非被apache和php共用,而是各用各的。比如apache中这两个文件一般在bin目录,而 php中就在php目录中。仔细看他们的信息会发现,这些文件都有版本信息,关键就是这个版本不一致导致。有人说将php中的这两个文件直接复制到 apache的bin目录中可以解决问题,但是不推荐这样做,因为也许在其他地方会出现错误。如果是自己配置,就下载apache和php中这两个文件版 本一致的。如果不想自己配置,可以使用xampp1.7.1版本。下载地址
5.最后说一下https的配置 (转自这里,并做了适当修改)
SSL: SSl是为Http传输提供安全的协议,通过证书认证来确保客户端和网站服务器之间的数据是安全。也就是说在SSL下http传输是安全的,我们成为 https. 
配置过程如下: 
步骤一:安装apache,使其支持SSL,并安装php 
1.安装配有SSL模块的apache,比如apache_2.2.8-win32-x86-openssl-0.9.8g 
2.配置apache以支持SSL:打开apache的配置文件conf/httpd.conf 
1)LoadModule ssl_module modules/mod_ssl.so、Include conf/extra/httpd-ssl.conf 
去掉两行前面的# 
2)注意修改httpd-ssl.conf 文件里的两个字段: 
SSLCertificateFile "C:/Apache2.2/conf/server.crt" 
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" 
3.安装php,整合apache和Php(略) 
为下面你所生成的证书和密钥地址。 
步骤二:为网站服务器生成证书及私钥文件 
1. 生成服务器的私钥
进入命令行: 
D:\local\apache2\bin\openssl genrsa -out server.key 1024 
在当前目录下生成了一个server.key生成签署申请 
2. 生成签署申请 
D:\local\apache2\bin>openssl req -new –out server.csr -key server.key -config..\conf\openssl.cnf 
此时生成签署文件server.csr. 
步骤三:通过CA为网站服务器签署证书
1.生成CA私钥 
D:\local\apache2\bin\openssl genrsa -out ca.key 1024 
多出ca.key文件 
2.利用CA的私钥产生CA的自签署证书 
D:\local\apache2\bin\openssl req -new -x509 -days 365 -key ca.key -out ca.crt -config ..\conf\openssl.cnf 
此时需要输入一些信息,注意Common Name为服务器域名,如果在本机,为本机IP。
3.CA为网站服务器签署证书 
D:\local\apache2\bin\openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config ..\conf\openssl.cnf
但,此时会报错,于是在在当前目录创建demoCA,里面创建以下文件,index.txt,serial,serial中内容为01,其他为空,以及文件夹 newcert.再执行一遍,即可生成server.crt文件 
步骤四:然后将 server.crt,server.key复制到apache的conf文件夹下,重启apache

若是使用了xampp,其中自带了证书和私钥,不用自己配置,直接支持https。只需修改http-ssl.conf中的documentroot字段,想用https访问哪个目录就改为哪个。
若以http访问,则http.conf中documentroot指向哪里,就访问哪里;若以https访问,则http-ssl.conf中的documentroot指向哪里就访问哪里。

php中ssl开发的若干问题的更多相关文章

  1. Open SSL 开发环境配置

    Open SSL 开发环境配置 最后更新日期:2014-05-13 阅读前提:VisualStudio的基本使用.Cent OS的基本使用 环境: Windows 8.1 64bit英文版,Visua ...

  2. Eclipse中Python开发环境搭建

    Eclipse中Python开发环境搭建  目 录  1.背景介绍 2.Python安装 3.插件PyDev安装 4.测试Demo演示 一.背景介绍 Eclipse是一款基于Java的可扩展开发平台. ...

  3. ARC中KVO开发注意

    1 在ARC 中 KVO开发 添加监听和去掉监听必需 一一匹配,不要有过的去掉监听否则会有可能导致对象无法释放. 例如,在一个viewcontroller中添加webview 并监听webview的c ...

  4. 动态调用WebService 通用方法Moss 中 传统开发中都可用。

    WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...

  5. java中 SSL认证和keystore使用

    java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报   目录(?)[+]     好久没用过SSL认证了,东西久不用,就有点生疏. ...

  6. 面试中有关C++的若干问题

    面试中有关C++的若干问题 By 晴天, 2014.5.16晚 什么是多态?简要说一下C++中的多态的概念. (1)定义:多态是指相同对象收到不同消息或者不同对象收到相同消息产生不同的行为. (2)C ...

  7. JAVA中SSL证书认证通讯

    JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...

  8. 【Git 使用笔记】第四部分:git在公司中的开发流程

    先声明几个变量 仓管A:主分支,只有master分支仓管B:开发分支,只有各个业务开发分支   仓管B fork 于 A 如下图 为了保证 代码的稳定性,只有 仓管B中的某个分支测试完毕并进行了代码r ...

  9. 教你如何获取ipa包中的开发文件

    教你如何获取ipa包中的开发文件 1. 从iTunes获取到ipa包 2. 修改ipa包然后获取里面的开发文件

随机推荐

  1. 【LeetCode】3Sum 解决报告

    这个问题是我目前的知识回答,不来,只有良好的网上搜索解决方案,发现 K Sum 它是一类问题,但是,互联网是没有更简洁的代码,我想对于谁刚开始学习的人.您可能仍然想看看这个问题该怎么解决,然后看看他们 ...

  2. C指针决心 ------ 指针表达式

    本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式.其结果是一个指针. 例1. int  a,b; ...

  3. C++ do while 0 使用和含义

    /* do while 0 的使用方法和意义 */ //近期在非常多代码里都看到do while 0的身影. 乍一看,这不是没有做不论什么事情吗?为什么还要这样写.难道这是多此一举的吗?当然不是. / ...

  4. SQL Server 服务器磁盘测试之SQLIO篇

    原文:SQL Server 服务器磁盘测试之SQLIO篇 数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速 ...

  5. 最近ubuntu 14.04 cpu高入住故障排除

    最近linux始终使用cpu实现全值, 双核cpu这始终是一个核心100%,还有的正常核.top这一发现输入法框架fcitx加载,直接kill它,不能用于发现狗输入法,令: fcitx fcitx-q ...

  6. Repair Cisco vpnclient on windows10

    Repair Cisco vpnclient on windows10 http://linux48.com/archives/435/ http://bbs.pcbeta.com/viewthrea ...

  7. zoj3791(An Easy Game) DP

    意甲冠军:给定两个01弦s1,s2.每一个变化s1在m字 - 位.要求k制作步骤之后s1变s2有多少种方法. 解法:DP,关键是状态的设计.考虑还是唯一性和可传递性.dp[i][j]表示第i步后有j个 ...

  8. hdu Simpsons’Hidden Talents(kmp)

    Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’ ...

  9. NYNU_省赛选拔题(10)

    题目描述 Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recog ...

  10. 包装类、Object类——Java笔记(八)

    包装类:     基本数据类型的包装类     基本数据类型 包装类 byte Byte short Short int Integer long Long char Character float ...