PHP – OpenSSL 生成CA私钥&证书及签发带SAN的证书

生成CA私钥及证书:

参考Example #1 Creating a self-signed certificate

使用上面的方法可以生成CA证书并使用,但是如果使用上面的方法直接生成的自签名域名证书,即使你把(CA)证书加入到了受信任的根证书列表,也不会受浏览器信任:


NET::ERR_CERT_COMMON_NAME_INVALID

此服务器无法证实它就是 localhost – 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。


你还需要把域名加入到SAN。

首先生成OpenSSL的配置文件:

通过上一步生成的配置文件生成CSR:

对CSR进行签名:

最后删除配置文件:

 

References:

https://secure.php.net/manual/en/function.openssl-csr-new.php

https://comm.support.ca.com/kb/adding-custom-x509-extensions-to-certificate-signing-requests/kb000042912

https://www.openssl.org/docs/manmaster/man5/x509v3_config.html#Basic-Constraints

https://github.com/openssl/openssl/blob/2cc7acd273bc39f1360aed52400d18bb65b88a95/apps/openssl.cnf#L36

https://bugs.php.net/bug.php?id=71050

https://stackoverflow.com/questions/30977264/subject-alternative-name-not-present-in-certificate

ERROR: failed to retrieve TCP_INFO for socket: Protocol not available (92)

 

PHP 7.2 compile on Debian Stretch

Libraries:

Configure:

Make

 

xmlrpc error 1:

Open Makefile, add

to the line(1933) where the error occured.

 

xmlrpc error 2:

 

find

in Makefile, add to the end of the line

 

readline error:

Open Makefile, searc

add “-lreadline”:

解除clock_gettime@@GLIBC_2.17的依赖

在x86_64的Debian Jessie上交叉编译一个mipsel架构的程序,能静态链接的都静态链接了。

程序编译好传送到mipsel架构的设备上时,ldd查看库的依赖,却提示

(⊙﹏⊙)b

mipsel设备上运行着Debian Wheezy,使用的是glibc 2.13:

尝试了更新到glibc 2.17,结果运行所有动态链接glibc的程序都提示Segmentation fault或Bus error,眼看要变砖!!!∑(゚Д゚ノ)ノ,最后用一个静态链接版本的busybox救回来( ̄▽ ̄)~*。

换到Wheezy再交叉编译?然而Debian的Wiki:

ヽ(ー_ー)ノ,还不想自己编译gcc。

查找了下资料,没找到让gcc链接到自定义libc的方法。

查找了下资料,根据此文章:http://blog.csdn.net/hbuxiaofei/article/details/46012833,发现我交叉编译的程序也是clock_gettime()函数导致的,但是这作者你只提供分析方法却不提供解决方案算什么意思ヽ(ー_ー)ノ。

找了下这个函数的资料,发现除了glibc外,动态链接库librt有独立提供这个函数: https://stackoverflow.com/questions/2418157/ubuntu-linux-c-error-undefined-reference-to-clock-gettime-and-clock-settim,于是在g++编译参数中加入了-lrt,编译完成后,把程序传送到mipsel架构的设备上,再次ldd,没有了”`GLIBC_2.17′ not found”的提示,程序运行正常,成功解除对glibc 2.17的依赖(o゚▽゚)o  :

探讨C语言返回struct的实现

C语言基本类型的返回通过寄存器实现。

寄存器容量不大,一个结构体的大小不定,多塞几个成员,很容易就会超过寄存器的容量,不太可能通过寄存器一次性返回一个结构体。

把以下代码转为汇编,探个究竟:

优化后的代码可能比较晦涩,64位寄存器数量是32位的一倍,为了简便理解,关闭代码优化,并且转为32位汇编,命令:

结果:

汇编代码已写上注释。

在get_struct()函数中,调用fun()之前,会首先把get_struct()函数中要接收返回值的地址压入栈中。

在fun()中,要返回值时,直接从get_struct()的栈帧取得保存结构体值的地址,直接对get_struct()的栈帧进行操作。

总的来说,一个函数要返回一个结构体,则从调用者函数的栈帧中取得接收结构体的地址(被赋值结构体的指针),直接对调用者函数的栈帧进行修改。