文档章节

php中ssl开发的若干问题

程序兵
 程序兵
发布于 2017/05/12 16:05
字数 1317
阅读 69
收藏 0

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指向哪里就访问哪里。

本文转载自:http://blog.sina.com.cn/s/blog_8da982ac0101lqh1.html

程序兵
粉丝 3
博文 35
码字总数 13902
作品 0
厦门
程序员
私信 提问
swoole-1.7.20 版本已发布,BUG 修复版本

swoole-1.7.20 版本已发布,此版本更新内容如下: 主要更新: swoole_http_request->rawContent() 函数在任意情况下都可以到POST Body 修复swoole_process::useQueue()第一个参数为0时消息队...

matyhtf
2015/10/21
1K
21
Bitnami-Redmine迁移升级后若干问题解决方案

在Bitnami-Redmine迁移升级到3.3.1版本后,出现了若干问题,类似于查看迁移后查看问题报500,url中http自动跳转成https等,现列出以下解决方案,亲测可行! 问题一:查看以前的项目报500,提示...

昊洋教育
2018/06/27
0
0
微信公众号支持微信支付流程

这里模拟一个微商城中选购物品,随后直接通过微信进行支付的场景, 1、申请微信公众平台账号,主要是身份证、手机号、营业执照等,申请之后等待微信确认,需要拍照上传公司盖章的一个说明,其...

斯沃勒科教工作室
2017/12/08
0
0
类似知客喵小程序平台的开发协助

我们正在开发一个类似知客喵小程序生成平台的系统(PHP开发语言),遇到若干技术问题,悬赏5000元请求协助,详情加QQ: 171799207 要求: 1、必须直接或间接参与开发过知客喵小程序系统; 2、...

你好曙光
2017/11/09
2
0
yii2 composer的异常处理

---title: yii2开发网站流程author: 不避风云date: '2015-11-04'identifier: scheme: ISBN text: xxxxxxxxxxpublisher: 不告诉你category: '计算机网站开发: Yii2开发网站记录' 第九章 部分异......

不避风云
2016/01/21
2.3K
7

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部