build curl on nss

1. build nss.

根据https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Reference/Building_and_installing_NSS/Build_instructions 提示, 进入security/nss
make nss_build_all .

make 说 ../nspr 找不到

于是,把nsprpub/ 目录考到 security/下 , 并改名为nspr/

再 进入 security/nss
make nss_build_all

成功!

2.  configure curl

env LD_LIBRARY_PATH=/home/xuyang/firefox29_src/mozilla-release/security/nss/lib/nss/Linux3.2_x86_glibc_PTH_DBG.OBJ ./configure –without-ssl –enable-debug –with-nss=/home/xuyang/firefox29_src/mozilla-release/security/dist/Linux3.2_x86_glibc_PTH_DBG.OBJ

这里指定的–with-nss会在后面的CPPFLAG中被用到,不过会在路径名后面加一个/include。

config 完,可以看见nss被启用。

make
很不幸, pk11pub.h等头文件找不到。
没办法,直接改lib/Makefile .

在CPPFLAGS 后面加 -I/home/xuyang/firefox29_src/mozilla-release/security/dist/public/nss

build , 通过。

build完的curl 在src/.libs/curl 目录下。

运行了一下,可用。接下来可以debug了。这个应该可以和firefox的trace进行一一比较。

————————–

结果最后找到了curl+nss的可安装包: libcurl4-nss-dev

sudo apt-get install libcurl-nss-dev 即可, 不过还是会碰到问题 libnsspem.so 找不到(by strace)。  :(

curl says: curl: (77) Problem with the SSL CA cert (path? access rights?)

 

解决这个问题的方法是加 –insecure

——–

最终利用debug 的nss , 可以打印出ssl.log , 命令行如下:
env LD_LIBRARY_PATH=/home/xuyang/firefox29_src/mozilla-release/security/nss/lib/ssl/Linux3.2_x86_glibc_PTH_DBG.OBJ:/home/xuyang/curlsrc/curl-7.37.0/lib/.libs NSPR_LOG_MODULES=timestamp,nsHttp:5 SSLKEYLOGFILE=sslkey.log SSLDEBUGFILE=ssl.log SSLDEBUG=60 SSLTRACE=60 NSPR_LOG_FILE=logfile.txt NECKO_SOCKET_TRACE_LOG=socket.log strace -e trace=open ./curl –insecure https://www.mozilla.org/en-US/

可用strace 看到给定的libnss3.so被装载,而且生成了ssl.log. !!

————————-

通过SSL的log可以看出,加密前的请求是一模一样的。因此问题在加密或者是摘要上面。通过valgrind callgraph, 看出firefox和curl采用的摘要算法是不一样的,一个是MD2,一个是MD5,

感兴趣的函数是:ssl3_ComputeRecordMAC:

重要区别在PK11_DigestOp=>NSC_DigestUpdate=>MD2/5_Update
这里的区别应该起源于
PK11_DigestBegin=>pk11_context_init=>NSC_DigestInit

curl 是pk11_context_init=>NSC_SignInit

需要进一步找到这些却别产生的原因。

———–

change the file ./security/nss/lib/freebl/loader.c to add some log info on the MD2/MD5 input to see if it is the really difference between firefox and curl. to be verified.

——

添加log信息之后,由于dump信息太多,firefox拒绝工作了….

如果直接打印config信息,发现二者的config基本一样。

现在怀疑–insecure 参数,因为没有验证服务器,也没有指定本地的ca db。可能会有问题,现在试着去掉–insecure参数,对于curl来说,碰到了nss_load_ca_certificates 函数在加载/etc/ssl/certs/ca-certificates.crt时失败的问题,而通过strace对firefox的跟踪,发现firefox并没有加载这个文件。接下来看看firefox在load ca_certificate时到底加载的是哪个文件。

——————————-

根据现在所知,nss在操作证书密码相关数据是通过操作一个nss数据库来实现的,所以firefox并没有装载什么证书文件,接下来要做的就是建一个nss数据库,然后再来跑curl on nss.

 

 

 

 



本文地址: http://www.bagualu.net/wordpress/archives/3517 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注