android.mk 条件编译,android openSSL 的苦逼历程
20180801 调试 Socket
1、按照以前的环境设置,出错了!
cd /Users/dhbm/Desktop/lxn/lxntransfer/tests
openssl s_server -key server-key.pem -cert server-cert.pem
返回:
Using default temp DH parameters
ACCEPT
2、还是先对付XCode 的程序,链接后服务端出现以下错误!(能看到错误就好办!)
bad gethostbyaddr
ERROR
140735513392008:error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca:s3_pkt.c:1500:SSL alert number 48
shutting down SSL
CONNECTION CLOSED
ACCEPT
3、本地测试,而且 CA 本身就错了!去掉 CA 验证
服务端能够收到客户端的问候了,但是还是有个错误
bad gethostbyaddr
-----BEGIN SSL SESSION PARAMETERS-----
MFoCAQECAgMDBAIABAQABDD18HpUfKUC7flnudhcKBwOtBIby9xg5kxHRMpxUezb
m8CLZMhNbkeRDL4mfl/hDtahBgIEW2FvcaIEAgIBLKQGBAQBAAAAqwMEAQE=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:RC4-MD5
Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
CIPHER is RC4-MD5
Secure Renegotiation IS supported
hello!I am WZH
4、换一个 SSL_METHOD
之前的代码是 TLSv1_method ,只认识 TLSv1
SSLv23_method 可以认识 SSLv2, SSLv3, and TLSv1
文档:
https://linux.die.net/man/3/ssl_ctx_new
5、XCode 看到 memeory 很满,程序中没有释放 BIO
*** 待处理
6、本地客户端测试
cd /Users/dhbm/Desktop/lxn/lxntransfer/testc
openssl s_client -connect 192.168.1.100:4433 -key client-key.pem -cert client-cert.pem
哈哈哈!也有那个错误信息
bad gethostbyaddr
7、怎么不能一边发送,一边接收?可能是 socket 模式需要切换,待处理
服务端自动回答: ' success ?
8、回到 android ,connect 总是失败!
int icnn = connect(sock, (struct sockaddr *) &sin, sizeof(sin));
9、是不是 ip 不对?tmd,忘记了接入 WLAN
adb shell
shell@hwChe2:/ $ ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
...
10、可以链接了!但是,程序被阻塞了!
bad gethostbyaddr
Hello!I am client WZH ,pid is 23008
11、后续还有不少问题啊!
1)、加个设置框,可以输入 ip 和 port
2)、Socket 关闭、打开时,不能阻塞
3)、可以正常 exit 程序
4)、可以发送信息到服务端
5)、可以接收服务端消息
6)、判断联网状态
7)、获取本机ip地址
20180801 开始对付 android 内存验证证书
1、修改一次包名后,出现了几个错误
1)、CMakeLists.txt中使用了绝对路径,需要手工修改
2)、C++程序中 函数包含的包名,手工修改
3)、C++中出现了 int_t3t is not compatible 错误,而且 NULL 也不认识了
4)、尝试修改意见后,不成功!但是,退出去再来,自己 ok 了
2、在 XCode 的时候,BIO 使用的函数都是 BIO* certBio = BIO_new(BIO_s_file());
到这里改成了 pkeyBio2 = BIO_new_mem_buf(pkeyBuf, -1);一步到位
3、分别验证证书、私钥都 ok ,准备对付 Socket
20180731 继续尝试 内存加载证书(在 XCode 先尝试)
1、昨天完成了从 pem 文件 读取 BIO ,再转换成 X509
1) 构建一个文件 BIO 数据结构(指针)
BIO* certBio = BIO_new(BIO_s_file());
2) 从 pem 文件读取到 certBio
BIO_set_fp(certBio,fp,BIO_NOCLOSE);
3) 从 certBio 转换成为 X509
X509* cert = PEM_read_bio_X509(certBio, NULL, NULL, NULL);
4)验证证书
i = SSL_CTX_use_certificate(ctx,cert);
2、昨天完成了从 Stream 读取到 Buffer ,再从 Buffer 转成 BIO,再从 BIO 转成 X509
1) 构建一个内存 BIO 数据结构(指针)
BIO* certBio = BIO_new(BIO_s_mem());
2) 从 Buffer 转存到 BIO ( Stream fread 就不记录了 )
BIO_write(certBio, &buff, (int)certLen);
3) 从 certBio 转换成为 X509
X509* cert = PEM_read_bio_X509(certBio, NULL, NULL, NULL);
4)验证证书
i = SSL_CTX_use_certificate(ctx,cert);
3、主要差别在于 BIO 结构的构建
4、开始对付下一个:私钥验证
按照证书验证同样的思路,查找对应的函数
参考
https://blog.csdn.net/andylau00j/article/details/73222042
文档
https://linux.die.net/man/3/ssl_ctx_use_privatekey_file
参考
http://yuanshuilee.blog.163.com/blog/static/21769727520140693950662/
过程反复就不记录了,总之,最终的思路和以上是一样的
5、 从 pem 文件 读取 BIO ,再转换成 EVP_PKEY
1) 构建一个文件 BIO 数据结构(指针)
pkeyBio=BIO_new(BIO_s_file()
2) 从 pem 文件读取到pkeyBio
BIO_set_fp(pkeyBio,fp2,BIO_NOCLOSE);
3) 从 pkeyBio 转换成 evpKey
evpKey=PEM_read_bio_PrivateKey(pkeyBio,NULL,NULL,NULL);
4)验证私钥
i = SSL_CTX_use_PrivateKey (ctx,evpKey);
6、从 pem Stream 读取到 Buffer,Buffer转成 BIO,再从 BIO 转换成 EVP_PKEY
1) 构建一个内存 BIO 数据结构(指针)
pkeyBio2=BIO_new(BIO_s_mem()
2) 从 Buffer 读取到pkeyBio
BIO_write(pkeyBio2, &buff2, (int)certLen2);
3) 从 pkeyBio 转换成 evpKey
evpKey=PEM_read_bio_PrivateKey(pkeyBio,NULL,NULL,NULL);
4)验证私钥
i = SSL_CTX_use_PrivateKey (ctx,evpKey);
7、理解 BIO
参考: OpenSSL中文手册之BIO库详解
https://blog.csdn.net/liao20081228/article/details/77193729
包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不同实现函数控制,包括6种filter型和8种source/sink型
8、理解 EVP_PKEY
参考:EVP_PKEY 以及 RSA 的区别
http://yuanshuilee.blog.163.com/blog/static/21769727520140693950662/
openssl定义了一种统一的接口方式,那就是EVP_PKEY存取接口
这种结构体可以保存各种不同的加密结构体,那样的话,就可以用同样的结构体保存不同的加密结构体
9、其他:学习了 Xcode 的几个技巧
1)忽略警告、查看警告类别
2)折叠代码、局部折叠
3)清除断点
4)条件编译、多条件 #if...#elif...#else...#endif
5) 改项目名字
10、明天对付 android
20180730 试试 内存加载证书
1、阅读文档
x = PEM_read_bio_X509(in, NULL, ssl->ctx->default_passwd_callback,
ssl->ctx->default_passwd_callback_userdata);
Now you will notice that macros like
#define PEM_write_X509(fp,x)
Don't do encryption normally. If you want to PEM encrypt your X509 structure,
either just call PEM_ASN1_write directly or just define your own
macro variant. As you can see, this macro just sets all encryption related
parameters to NULL.
*** 这是从 pen 文件 读取数据,转换成 X509
2、 先到 xcode 去测试
最终目的,要从一个数组(内存)转换成 X509 之后,才能验证证书
X509 *client_cert = (X509 *) env->GetByteArrayElements(client_cert_, NULL);
20180730 试试 android asset 文件读写
1、准备将证书文件放在 asset 目录,然后,java 获取到资源的 path ,传递给 c++
2、单独做一个验证证书的函数,先试试看这种方法
3、参考 AS 的ndk demo 源码 android_ndk_master 中的 native-audio
*** 在 main 目录建立一个新目录 assets (我直接 copy native-audio 的assets目录)
4、找到的这个文件,只能通过 assetManager 去读写,所以,这个方法还是不可以!
5、直接 adb shell 看看他到底存到哪里了?
*** 这是 run 的脚本
$ adb push /Users/dhbm/Desktop/jni/jni20180727/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/openSSL
$ adb shell pm install -t -r "/data/local/tmp/openSSL"
pkg: /data/local/tmp/openSSL
*** 手工查看
shell@hwChe2:/ $ cd data
shell@hwChe2:/data $ ls
opendir failed, Permission denied
*** 不允许!
6、只能放弃文件读写方式来加载证书了!试试内存加载了!
20180730 继续处理 android 证书不认识
1、阅读 sss_rsa.c ,疑问是
SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_FILE, ERR_R_BUF_LIB);
怎么打印出来?否则,无法知道错误原因!
2、按照文档,ERR_get_error
LOGI("ERR_get_error 123 ==%d", ERR_get_error);
得到一个错误号 ERR_get_error ==1084071057
错误号怎么对应原因?
3、参考
https://blog.csdn.net/hepfei90/article/details/44023467
*** 加上以下代码
long ulErr = ERR_get_error();
char szErrMsg[1024] = {0};
char *pTmp = NULL;
pTmp = ERR_error_string(ulErr,szErrMsg);
LOGI("pTmp===%s",pTmp);
*** 终于知道错误原因了!就是找不到文件!android 的文件着实费劲!
pTmp===error:02001002:system library:fopen:No such file or directory
4、印象中,验证证书有 2 种方式,去找找不用文件的方式
以上文件方式,应该是属于 使用RSA_vefify函数未能成功验证签名,改为使用evp相关函数进行签名验证
找到一个,不知道是不是
https://blog.csdn.net/enjoyinwind/article/details/23530303
从之前的例子抄写一个过来 verifyByRSAPubKey
5、还是有个问题:后续通信都需要设置、加载到上下文 CTX,不是仅仅验证一下
SSL_use_certificate
6、找到我以前的项目 GG123.java 中 GetFromRawFile
将证书放在 raw 数据中
测试结果:
pTmp===error:02001002:system library:fopen:No such file or directory
MYCERTF===/Users/dhbm/Desktop/jni/jni20180727/app/src/main/res/raw/clientcert.pem
引用方式不应该是这种路径,因为 android 里面不会有这个目录的!
先饭饭!下午继续
20180729 理解服务端证书和客户端证书
1、看了半天,也没有发现具体过程有什么差别
2、一般情况下都是单项认证的,理解过程如下:
1)、客户端发送一个消息(请求)到服务端,这个时候没有什么加密、签名字累
2)、服务端收到消息(请求),发送一个加密消息(私钥),连同一把钥匙(公钥)给客户端
3)、客户端收到了服务器的消息(应答),用服务器给的钥匙(公钥)解密验证签名,对了?!好,可以继续
4)、用这把钥匙(公钥)加密发送后续的消息给服务端,服务端自己当然会认识的!
3、双向认证的情况其实差不多,
1)、客户端发送一个消息(请求)到服务端,这次是用客户端的私钥加密了,所以带上自己的签名(客户端公钥)
2)、服务端收到消息(请求),因为这次是加密的,所以,先用客户端带上的钥匙(客户端公钥)解密,确认客户签名对不对?
3)、对了?!好!服务端发送一个加密消息(私钥),连同一把钥匙(公钥)给客户端(同单项的步骤2),确认服务器对不对?
4)、客户端收到了服务器的消息(应答),用服务器给的钥匙(公钥)解密验证签名,
5)、对了?!好!用这把钥匙(公钥)加密发送后续的消息给服务端,服务端自己当然会认识的(同单项步骤4)
*** 客户端的私钥干么用?好像就第一轮用了
*** 客户端的公钥呢?后面每一轮都用了 服务端公钥 和 客户端公钥(每一轮都要自己签名)
4、这么说,客户端证书和服务端证书的创建过程,没有什么两样,只是使用的地方不一样
5、先理解到这里,回头直接copy myserver 到一份 myclient
6、还是要对付证书内容直接写入到代码,避开 android 文件读写问题
7、找出 SSL_CTX_use_certificate_file 的代码看看
1)、在 ssl.h 定义了 int
SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
2)、源代码呢?整个目录不能在 Xcode 打开,直接拖进来 AS ,然后 find inpath ,哈哈!找到了
在这里 /Users/dhbm/Desktop/ssl/openssl-1.0.2o/ssl/ssl_rsa.c
3)、源代码看到,他还是调用了这个!
ret = SSL_CTX_use_certificate(ctx, x);
4)、读取文件调用的是这个,看看他是怎么变成 X509 格式的?
x = PEM_read_bio_X509(in, NULL, ctx->default_passwd_callback,
ctx->default_passwd_callback_userdata);
5)最终判断证书结果的是这个函数 (ssl_cert_inst(&ctx->cert))
8、想到 Android 下面的文件读取
参考:
https://blog.csdn.net/brandon2015/article/details/50508834
明天再继续以上 2 个问题
20180729 学习 openssl 证书命令
1、参考
https://blog.csdn.net/madding/article/details/26717963
2、在我电脑建立好一个目录,并启动 terminal ,进入该目录
cd /Users/dhbm/Desktop/ssl/sign20180729
3、生成Self Signed证书
1)、生成一个key(我的私钥)
openssl genrsa -des3 -out selfsign.key 4096
结果 (过程中 密码: 123456)
Generating RSA private key, 4096 bit long modulus
...........++
...........................++
e is 65537 (0x10001)
Enter pass phrase for selfsign.key:
Verifying - Enter pass phrase for selfsign.key:
*** 这时应该生成了一个文件:selfsign.key
ls
selfsign.key
2)使用我的私钥(上面生成的key),生成一个自签名请求 certificate signing request (CSR)
openssl req -new -key selfsign.key -out selfsign.csr
结果
Enter pass phrase for selfsign.key:
unable to load Private Key
140735584793480:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:531:
140735584793480:error:0906A065:PEM routines:PEM_do_header:bad decrypt:pem_lib.c:488:
Enter pass phrase for selfsign.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:dhbm.cn
Organizational Unit Name (eg, section) []:dhbm.cn
Common Name (e.g. server FQDN or YOUR name) []:wzh
Email Address []:13501062476@139.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:dhbm.cn
*** 这时应该又生成了一个文件 selfsign.csr
ls
selfsign.csr selfsign.key
3)、用以上证书请求文件(selfsign.csr),生成Self Signed证书
openssl x509 -req -days 365 -in selfsign.csr -signkey selfsign.key -out selfsign.crt
结果
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=dhbm.cn/OU=dhbm.cn/CN=wzh/emailAddress=13501062476@139.com
Getting Private key
Enter pass phrase for selfsign.key:
*** 这时应该又生成了一个文件 selfsign.crt
ls
selfsign.crt selfsign.csr selfsign.key
4、生成自己的CA (Certificate Authority)
1)、生成CA的key,这一步和生成证书一样,也是一个私钥,文件名 叫 ca.key
openssl genrsa -des3 -out ca.key 4096
结果:
Generating RSA private key, 4096 bit long modulus
..................................................................................................++
.....................................++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
*** 这时应该又生成了一个文件 ca.key
ls
ca.key selfsign.crt selfsign.csr selfsign.key
2)、生成CA的证书请求、证书 (两步合二为一了)
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
结果
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:dhbm.cn
Organizational Unit Name (eg, section) []:dhbm.cn
Common Name (e.g. server FQDN or YOUR name) []:wzh
Email Address []:13501062476@139.com
*** 这时应该又生成了 1 个文件 ca.crt (没有 ca.csr?)
ls
ca.crt ca.key selfsign.crt selfsign.csr selfsign.key
5、生成服务器证书,由以上自建的 CA 颁发
1)、前面 2 步 和以上一样,生成一个 私钥(key),生成一个证书请求(csr)
### 生成私钥
openssl genrsa -des3 -out myserver.key 4096
结果:
Generating RSA private key, 4096 bit long modulus
...................................................................++
...............................................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for myserver.key:
Verifying - Enter pass phrase for myserver.key:
生成证书请求
openssl req -new -key myserver.key -out myserver.csr
结果:
Enter pass phrase for myserver.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:dhbm.cn
Organizational Unit Name (eg, section) []:dhbm.cn
Common Name (e.g. server FQDN or YOUR name) []:wzh server
Email Address []:13501062476@139.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:dhbm.cn
### 这次和以上不一样,加上了一个中间人 CA ,表示这是由 CA 认可并办法的证书
openssl x509 -req -days 365 -in myserver.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out myserver.crt
结果:
Signature ok
subject=/C=cn/ST=BeiJing/L=BeiJing/O=dhbm.cn/OU=dhbm.cn/CN=wzh server/emailAddress=13501062476@139.com
Getting CA Private Key
Enter pass phrase for ca.key:
*** 到这里,又生成了 3 个文件 myserver.key,myserver.csr,myserver.crt
ls
ca.crt myserver.crt myserver.key selfsign.csr
ca.key myserver.csr selfsign.crt selfsign.key
6、查看我的证书情况 (myserver)
1)、查看我的私钥
openssl rsa -noout -text -in myserver.key
结果
Enter pass phrase for myserver.key:
Private-Key: (4096 bit)
modulus:
00:b7:cb:ad:ad:37:bd:e9:3d:a2:36:10:1b:e6:8e:
0c:b7:83:09:3d:3e:09:94:a0:85:b2:2a:c6:68:29
...
2)、查看我的证书请求
openssl req -noout -text -in myserver.csr
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=cn, ST=BeiJing, L=BeiJing, O=dhbm.cn, OU=dhbm.cn, CN=wzh server/emailAddress=13501062476@139.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:b7:cb:ad:ad:37:bd:e9:3d:a2:36:10:1b:e6:8e:
0c:b7:83:09:3d:3e:09:94:a0:85:b2:2a:c6:68:29:
...
Attributes:
challengePassword :123456
unstructuredName :dhbm.cn
Signature Algorithm: sha256WithRSAEncryption
00:6f:04:6c:30:93:88:34:ee:43:f2:ce:2b:d0:3e:11:20:46:
...
3)、查看我的证书
openssl x509 -noout -text -in myserver.crt
Data:
Version: 1 (0x0)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=BeiJing, L=BeiJing, O=dhbm.cn, OU=dhbm.cn, CN=wzh/emailAddress=13501062476@139.com
Validity
Not Before: Jul 29 09:02:55 2018 GMT
Not After : Jul 29 09:02:55 2019 GMT
Subject: C=cn, ST=BeiJing, L=BeiJing, O=dhbm.cn, OU=dhbm.cn, CN=wzh server/emailAddress=13501062476@139.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:b7:cb:ad:ad:37:bd:e9:3d:a2:36:10:1b:e6:8e:
0c:b7:83:09:3d:3e:09:94:a0:85:b2:2a:c6:68:29:
...
4)、验证我的证书
openssl verify -CAfile ca.crt myserver.crt
myserver.crt: OK
7、到这里完成了 3 步 ,自建名证书、CA证书、CA颁发 myserver 证书
疑问:什么是服务端用的?什么是客户端用的?
待继续...先晚饭去!
20180728 继续处理 android 不认识证书
1、下载了 2 个相关例子
安全加密C语言库OpenSSL,在Android中服务器和客户端之间的签名验证和数据加密通信等
https://github.com/GitPhoenix/OpenSSL
安全加密C语言库OpenSSL,在Android中服务器和客户端之间的签名验证和数据加密通信等
https://github.com/GitPhoenix/OpenSSL
打开发现,代码是一样的!
惭愧啊!抄写都不会!他的所有代码都已经在 cipher.cpp 里面实现了!
2、一个一个的学习,Java_com_alley_openssl_util_JniUtils_signByRSAPrivateKey
首先学习 BIO
参看:
https://blog.csdn.net/pur_e/article/details/52382579
英文原版
https://wiki.openssl.org/index.php/BIO
3、学习我自己项目的源码,主要看功能和返回值,直接注释在代码里面
1)、加载CA的证书 ssl_ctx_load_verify_locations
文档
https://linux.die.net/man/3/ssl_ctx_load_verify_locations
2)、有个疑问:能不能直接将证书内容写在代码里面,不再依赖 CA 文件?
*** android 不对是不是因为文件读写权限问题?
//内存卡的读取权限
也加上
尝试了,结果也不对!
3、加载自己的证书 ssl_ctx_use_certificate_chain_file
文档
https://linux.die.net/man/3/ssl_ctx_use_certificate_chain_file
功能:
load the certificates and private keys into the SSL_CTX or SSL object
但出现了新的问题,还是那个函数,报错变成了:
error:140BF10C:SSL routines:ssl_set_cert:x509 lib
4、ssl_ctx_use_certificate_chain_file换成 SSL_CTX_use_certificate(ctx, X509 *x)试试
*** c++里面不会拼接,在 java 拼接比较方便!试试看
int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d);
5、先继续往下 SSL_CTX_use_PrivateKey_file
尝试改成 SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
文档
https://linux.die.net/man/3/ssl_ctx_use_privatekey_file
4、今天搞不定了!明天先学习 openssl 命令行手工验证证书,然后还是要想办法将证书内容直接写入代码
20180727 先放弃Android。mk 的例子,继续 CMake 的例子
1、两天没有记录,有些已经忘记了,大概有一下几点
1)、学习 cmake、android。mk 的网址
https://developer.android.google.cn/ndk/guides/android_mk
包括了 AS 嘘唏,还有 native activity 在这里都可以找到,以后再继续回来学习
2)、找到一个 cmake 方式的 openssl 项目,直接使用了他的 2 个库文件 libssl.so 和 libcrypto.so
3)、编译总是提示一些错误,还有 sync gradle 总是失败,最后发现是 build.gradle 文件里面
allprojects -- repositories 以前只有 jcenter ,加上了 google() 之后 ,sync gradle 可以成功了
4)、尝试了修改包名,修改包的中间名,最好在 Package 浏览方式下完成,
5)、中间包名要在那个 项目设置(齿轮图标)功能上 (网上贴图那些 Tools -Android tools 在mac版上找不到菜单的)
6)、自行创建一个新的 ndk 项目 ,copy 人家那 2 个 so 文件
7)、罩着人家的 CMakeList.txt 修改到自己的 so 路径,再编译,ok了!
2、先放弃android编译openssl和 camke 学习,开始正式写代码
*** 之前 c++代码 红字报错的地方 ,按 alt + Enter 会自动加上 include ,现在不知道为什么不行了?
3、复制之前在 Xcode 调试通过的 client.c 过来,出现证书不认识了!调试发现了以下问题
以下 4 个函数正常返回值 在 xcode command 项目
SSL_CTX_load_verify_locations === 0
SSL_CTX_use_certificate_file === 1
SSL_CTX_use_PrivateKey_file === 1
SSL_CTX_check_private_key === 1
但是,在这里的结果
加载CA的证书
SSL_CTX_load_verify_locations ==0
加载自己的证书
SSL_CTX_use_certificate_file ==0
加载自己的私钥
SSL_CTX_use_PrivateKey_file ==0
判定私钥是否正确
SSL_CTX_check_private_key ==0
4、回头去学习 openssl 和 android 证书方面的知识
20180725 回到之前找到的这个可以使用的例子,继续
1、新建 2 个目录 crypto1.0.2 和 ssl1.0.2
2、从 下载的 1.0.2的源码复制过来
3、备份好 3 个 mk 文件
4、分别复制 ssl 和 crypto 目录的 Android.mk 到 1.0.2
*** local_src_files 下面那些源文件名怎么生成的?
20180725 对付编译 gcc 和 Clang
1、查看一下,gcc 和 Clang 在我的电脑都是安装了的
gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
2、尝试修改 setenv-android.sh 修改 _ANDROID_EABI="x86_64-4.9" 和 _ANDROID_ARCH=arch-x86,
然后,以下错误
Error: Failed to find i686-linux-android-gcc. Please edit this script.
Error: Failed to find i686-linux-android-ranlib. Please edit this script.
Error: Failed to find i686-linux-android-ld. Please edit this script.
我的 ndk 编译也不是 i686-linux-android-gcc ,而是 /Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++
难怪现在折腾到 模拟器 也用不了了!
3、 改回到 _ANDROID_EABI="x86_64-4.9" 和 _ANDROID_ARCH=arch-arm
4、先去安装一个工具 greadelf
用greadelf和gobjdump对应在linux下,用readelf来看ELF头部或者其它各section的内容,用objdump来对指定的内容(.text, .data等)进行反汇编
brew update && brew install binutils
安装完成,先试试
greadelf --version
GNU readelf (GNU Binutils) 2.31.1
gobjdump --version
GNU objdump (GNU Binutils) 2.31.1
先查查我之前生成的 libcrypto.a
greadelf -h ./libcrypto.a | grep -i 'class\|machine' | head -2
一大堆错误啊!
readelf:错误:不是 ELF 文件 - 它开头的 magic 字节错误
readelf:错误:不是 ELF 文件 - 它开头的 magic 字节错误
readelf:错误:不是 ELF 文件 - 它开头的 magic 字节错误
...
*** 关于 ELF 文件 (以后用到再学习)
1).ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、
2).以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。
3).可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人员,你最好熟悉并掌握它
5、在项目的 app/CMakeFiles 目录下的 CMakeOutput.log 看到以下 2 个信息
The C compiler identification is AppleClang,....
The CXX compiler identification is AppleClang,...
再看看 CompilerldC 的 CMakeCCompilerId.c ,
还有 CompilerldCXX 下的 CMakeCCompiler.cmake ,CMakeCXXCompiler.cmake
看到那些脚本,头大了!我哪里会修改那些玩意儿!
6、放弃!?因为在Android设备上面运行,建议不要编译完整的OpenSSL库
7、回头去学习 openssl 源代码库
20180724 再编译 openssl,记录过程
1、按照 https://wiki.openssl.org/index.php/Android#Prepare_the_OpenSSL_Sources 的流程
参考
https://segmentfault.com/a/1190000005747285
在 setenv-android.sh 之外的命令中,$ANDROID_API,$ANDROID_TOOLCHAIN等都会失效
按照我自己的环境,直接写死了执行
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/$ANDROID_API --prefix=/usr/local/ssl/$ANDROID_API
对应为
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/android-21/ --prefix=/usr/local/ssl/android-21
返回结果:
Configured for darwin-i386-cc.
*** Because of configuration changes, you MUST do the following before
*** building:
make depend
中间看到好多错误!?
*** 另外:1。1。1版本的 .config 返回结果如下,好像和 1.0.2o ,1.1.0f 不一样
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/android-21/
Operating system: x86_64-apple-darwinDarwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root:xnu-4570.20.62~3/RELEASE_X86_64
***** Deprecated options: no-ssl2
Configuring OpenSSL version 1.1.1-pre9-dev (0x10101009L) for darwin64-x86_64-cc
Using os-specific seed configuration
^CdhbmdeMacBook-Pro:openssl-1.1.1e dhbm$ ./config shared no-ssl2 no-ssl3 no-comno-hw no-engine --openssldir=/usr/local/ssl/android-21/
Operating system: x86_64-apple-darwinDarwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root:xnu-4570.20.62~3/RELEASE_X86_64
***** Deprecated options: no-ssl2
Configuring OpenSSL version 1.1.1-pre9-dev (0x10101009L) for darwin64-x86_64-cc
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
**********************************************************************
*** ***
*** If you want to report a building issue, please include the ***
*** output from this command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
**********************************************************************
WARNING! If you wish to build 32-bit libraries, then you have to
invoke 'KERNEL_BITS=32 ./config 'shared' 'no-ssl2' 'no-ssl3' 'no-comp' 'no-hw' 'no-engine' '--openssldir=/usr/local/ssl/android-21/''.
2、 make all
3、 sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib
先查查环境
echo $ANDROID_TOOLCHAIN
*** 空的!
4、再次记录一下 ./setenv-android.sh 的返回,这里有那些环境变量的
ANDROID_NDK_ROOT: /Users/dhbm/Library/Android/sdk/ndk-bundle
ANDROID_ARCH: arch-arm
ANDROID_EABI: arm-linux-androideabi-4.9
ANDROID_API: android-21
ANDROID_SYSROOT: /Users/dhbm/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-arm
ANDROID_TOOLCHAIN: /Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin
FIPS_SIG:
CROSS_COMPILE: arm-linux-androideabi-
ANDROID_DEV: /Users/dhbm/Library/Android/sdk/ndk-bundle/platforms/android-21/arch-arm/usr
5、直接替换 ANDROID_TOOLCHAIN
sudo -E make install CC=/Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc RANLIB=/Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ranlib
返回结果如下
Install the OpenSSL Library placed the cross-compiled library in /usr/local/ssl
6、查看一下
cd /usr/local/ssl/android-21/lib
ls
engines libcrypto.dylib libssl.dylib
libcrypto.1.0.0.dylib libssl.1.0.0.dylib pkgconfig
libcrypto.a libssl.a
确实有新生成的 libcrypto.a 等库文件了
7、继续执行 Prepare_the_OpenSSL_Sources 文档的流程: Compile and Link against the Library
找找 arm-linux-androideabi-gcc
cd /Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin
ls
arm-linux-androideabi-addr2line arm-linux-androideabi-gcov
arm-linux-androideabi-ar arm-linux-androideabi-gcov-tool
arm-linux-androideabi-as arm-linux-androideabi-gprof
arm-linux-androideabi-c++ arm-linux-androideabi-ld
arm-linux-androideabi-c++filt arm-linux-androideabi-ld.bfd
arm-linux-androideabi-cpp arm-linux-androideabi-ld.gold
arm-linux-androideabi-dwp arm-linux-androideabi-nm
arm-linux-androideabi-elfedit arm-linux-androideabi-objcopy
arm-linux-androideabi-g++ arm-linux-androideabi-objdump
arm-linux-androideabi-gcc arm-linux-androideabi-ranlib
arm-linux-androideabi-gcc-4.9 arm-linux-androideabi-readelf
arm-linux-androideabi-gcc-4.9.x arm-linux-androideabi-size
arm-linux-androideabi-gcc-ar arm-linux-androideabi-strings
arm-linux-androideabi-gcc-nm arm-linux-androideabi-strip
arm-linux-androideabi-gcc-ranlib
没有设置环境变量,就在这里执行试试
./arm-linux-androideabi-gcc -I /usr/local/ssl/include my_prog.c -o my_prog.exe -L /usr/local/ssl/lib -lssl -lcrypto
arm-linux-androideabi-gcc: error: my_prog.c: No such file or directory
/usr/local/ssl/include 目录下并没有 my_prog.c
换成我自己的源代码试试
我的 jni 代码位置 /Users/dhbm/Desktop/ndk/jni2018072401/app/src/main/cpp
./arm-linux-androideabi-gcc -I /usr/local/ssl/include /Users/dhbm/Desktop/ndk/jni2018072401/app/src/main/cpp/native-lib.cpp -o native-lib.exe -L /usr/local/ssl/lib -lssl -lcrypto
结果:错的更多,stdlib 等标准库都找不到了
8、总是不对,再次从头来过,
下载 https://segmentfault.com/a/1190000005747285 的生成好的脚本
https://github.com/jjz/script/blob/master/build_android_openssl.sh
9、我下载的 1.0.2o , 1.1.0f ,1.1.1e 三个版本来回折腾
都是枉然,结果都一样
10、回到 AS Make Project ,再看看错误记录,找找头绪
错误信息如下
Build command failed.
Error while executing process /Users/dhbm/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/dhbm/Desktop/ndk/jni2018072405/app/.externalNativeBuild/cmake/debug/x86_64 --target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/x86_64/libnative-lib.so
FAILED: : && /Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android --gcc-toolchain=/Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/dhbm/Library/Android/sdk/ndk-bundle/sysroot -fPIC -isystem /Users/dhbm/Library/Android/sdk/ndk-bundle/sysroot/usr/include/x86_64-linux-android -D__ANDROID_API__=23 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++ --sysroot /Users/dhbm/Library/Android/sdk/ndk-bundle/platforms/android-23/arch-x86_64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -L/Users/dhbm/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86_64 -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/x86_64/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o ../../../../src/main/cpp/libssl.a ../../../../src/main/cpp/libcrypto.a -llog -latomic -lm "/Users/dhbm/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86_64/libc++_static.a" "/Users/dhbm/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/x86_64/libc++abi.a" && :
/Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld: error: ../../../../src/main/cpp/libssl.a: no archive symbol table (run ranlib)
/Users/dhbm/Library/Android/sdk/ndk-bundle/toolchains/x86_64-4.9/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld: error: ../../../../src/main/cpp/libcrypto.a: no archive symbol table (run ranlib)
/Users/dhbm/Desktop/ndk/jni2018072405/app/src/main/cpp/native-lib.cpp:13: error: undefined reference to 'OpenSSL_version'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
现在编译总是 darwin-x86_64/bin/clang++ ,
我想要的是 arm-linux-androideabi-gcc
怎么办????明天再继续
20180724 从头来过测试项目
1、AS 新建一个项目
2、确认一下 include
cd /usr/local/include/openssl
ls -l
里面的 h 文件确实是刚才生成的!
之前无数次到处着 openssl的 include ,好多次发现俩民的 h 文件 都是替身!真是悲催!
3、复制 openssl 目录过来( 我使用 2 个 finder 窗口图形化操作)
4、复制 2 个 库文件,直接放到 cpp 目录下,好找!
修改 CMakeList 文件
error: use of undeclared identifier 'OPENSSL_VERSION'
return env->NewStringUTF(OpenSSL_version(OPENSSL_VERSION));
undefined reference to `OpenSSL_version'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
20180724 重新编译openssl
1、我的文件放在 /Users/dhbm/Desktop/ssl/openssl-1.1.0f
2、修改 setenv-android.sh 以下是修改过的地方
ANDROID_NDK_ROOT=/Users/dhbm/Library/Android/sdk/ndk-bundle
_ANDROID_EABI="arm-linux-androideabi-4.9"
_ANDROID_ARCH=arch-arm
_ANDROID_API="android-23"
3、其他环境变量查看、设置
cd ~
ls -ah 就可以看到 .bash_profile 这个文件
vim .bash_profile
以下是我的设置
# by wzh 20180720 set cmake path
export PATH=${PATH}:/Users/dhbm/Library/Android/sdk/cmake/3.6.4111459/bin
# by wzh 20180719 re-set SDK,NDK
export ANDROID_SDK=/Users/dhbm/Library/Android/sdk
export ANDROID_HOME=/Users/dhbm/Library/Android/sdk
export ANDROID_SDK_ROOT=/Users/dhbm/Library/Android/sdk
export ANDROID_SDK
export ANDROID_HOME
export ANDROID_SDK_ROOT
export NDK_ROOT=/Users/dhbm/Library/Android/sdk/ndk-bundle
export ANDROID_NDK_ROOT=/Users/dhbm/Library/Android/sdk/ndk-bundle
export ANDROID_NDK_HOME=/Users/dhbm/Library/Android/sdk/ndk-bundle
export NDK_ROOT
export ANDROID_NDK_ROOT
export ANDROID_NDK_HOME
4、ndk 的版本要到 AS 里面的 Tools -> SDK manage
4、make depend 出现一堆找不到文件的错误
参考
https://wiki.openssl.org/index.php/Android#Prepare_the_OpenSSL_Sources
./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=/usr/local/ssl/android-23/
再来
make all
还是有错!前一次怎么对的?
making all in crypto...
making all in crypto/objects...
ar r ../../libcrypto.a o_names.o obj_dat.o obj_lib.o obj_err.o obj_xref.o
ar: ../../libcrypto.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: ../../libcrypto.a: Inappropriate file type or format
make[2]: *** [lib] Error 1
make[1]: *** [subdirs] Error 1
make: *** [build_crypto] Error 1
5、干脆重新下载 1.1.0f
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
amke depend
make all
结果
find . -name libcrypto.a
./libcrypto.a
find . -name libssl.a
./libssl.a
确认一下生成时间 ls -l libcrypto.a
-rw-r--r-- 1 dhbm staff 3615576 7 24 08:30 libcrypto.a
6、按照文档 Install the OpenSSL Library ,不明白要干什么?
参考
https://www.jianshu.com/p/b790c548e787
sudo -E make install CC=$ANDROID_TOOLCHAIN/arm-linux-androideabi-gcc RANLIB=$ANDROID_TOOLCHAIN/arm-linux-androideabi-ranlib
摘录其中几行
/Applications/Xcode.app/Contents/Developer/usr/bin/make depend && /Applications/Xcode.app/Contents/Developer/usr/bin/make _all
*** Installing development files
...
install ./include/openssl/opensslv.h -> /usr/local/include/openssl/opensslv.h
install ./include/openssl/ssl.h -> /usr/local/include/openssl/ssl.h
...
全部都是复制 .h 文件到 系统的 include 下
最后出现一个错误
install libcrypto.a -> /usr/local/lib/libcrypto.a
/bin/sh: /arm-linux-androideabi-ranlib: No such file or directory
make: *** [install_dev] Error 1
7、干脆什么参数都不带
make install
这回执行的可多了
开头部分
dhbmdeMacBook-Pro:openssl-1.1.0f dhbm$ sudo make install
Password:
/Applications/Xcode.app/Contents/Developer/usr/bin/make depend && /Applications/Xcode.app/Contents/Developer/usr/bin/make _all
*** Installing development files
install ./include/openssl/aes.h -> /usr/local/include/openssl/aes.h
install libcrypto.a -> /usr/local/lib/libcrypto.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /usr/local/lib/libcrypto.a.new(async_null.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /usr/local/lib/libcrypto.a.new(async_win.o) has no symbols
install libssl.a -> /usr/local/lib/libssl.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /usr/local/lib/libssl.a.new(ssl_utst.o) has no symbols
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /usr/local/lib/libssl.a.new(t1_trce.o) has no symbols
install libcrypto.1.1.dylib -> /usr/local/lib/libcrypto.1.1.dylib
created directory `/usr/local/lib/engines-1.1'
*** Installing engines
*** Installing runtime files
install libcrypto.1.1.dylib -> /usr/local/lib/libcrypto.1.1.dylib
*** Installing manpages
/usr/bin/perl ./util/process_docs.pl \
--destdir=/usr/local/share/man --type=man --suffix=
/usr/local/share/man/man3/d2i_SSL_SESSION.3
/usr/local/share/man/man3/i2d_SSL_SESSION.3 -> /usr/local/share/man/man3/d2i_SSL_SESSION.3
/usr/local/share/man/man3/DTLSv1_listen.3
/usr/local/share/man/man3/OPENSSL_init_ssl.3
/usr/local/share/man/man3/EVP_cleanup.3 -> /usr/local/share/man/man3/OpenSSL_add_all_algorithms.3
/usr/local/share/man/man3/OPENSSL_Applink.3
/usr/local/share/man/man3/OPENSSL_config.3
/usr/local/share/man/man3/OPENSSL_no_config.3 -> /usr/local/share/man/man3/OPENSSL_config.3
/usr/local/share/man/man3/OPENSSL_ia32cap.3
/usr/local/share/man/man3/OPENSSL_init_crypto.3
/usr/local/share/man/man3/OPENSSL_init_new.3 -> /usr/local/share/man/man3/OPENSSL_init_crypto.3
*** Installing HTML manpages
/usr/bin/perl ./util/process_docs.pl \
--destdir=/usr/local/share/doc/openssl/html --type=html
/usr/local/share/doc/openssl/html/man3/d2i_SSL_SESSION.html
/usr/local/share/doc/openssl/html/man3/i2d_SSL_SESSION.html -> /usr/local/share/doc/openssl/html/man3/d2i_SSL_SESSION.html
/usr/local/share/doc/openssl/html/man3/DTLSv1_listen.html
/usr/local/share/doc/openssl/html/man3/OPENSSL_init_ssl.html
最后几行内容是
/usr/local/share/doc/openssl/html/man1/verify.html
/usr/local/share/doc/openssl/html/man1/version.html
/usr/local/share/doc/openssl/html/man1/x509.html
/usr/local/share/doc/openssl/html/man5/x509v3_config.html
感觉像是直接安装到系统了,先看看版本号,并没有改变!
openssl version
OpenSSL 1.0.2n 7 Dec 2017
重启之后再来看看!确认没有变化!
20180723 继续 cmake
1、从我的 5.0 的华为手机copy 出来 2 个 so 文件
参考
http://blog.sina.com.cn/s/blog_540316260102wsnc.html
2、复制(不要拖入,否则源的地方就没有了)到 我的项目 的 src/main/cpp 和项目的 libs 目录,方便查找
并且使用 add_library 加上 set_target_properties 方法 (相对路径、绝对路径都试试)
*** 添加已经预先编译出来的 库 ( 都是引入的 IMPORTED)
add_library(
ssl-lib
### SHARED
STATIC
IMPORTED )
set_target_properties(
ssl-lib
PROPERTIES IMPORTED_LOCATION
src/main/cpp/libssl.so
/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp
/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp/libssl.so
/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp/libssl.a
add_library(
crypto-lib
SHARED
STATIC
IMPORTED )
set_target_properties(
crypto-lib
PROPERTIES IMPORTED_LOCATION
src/main/cpp/libcrypto.so
/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp
/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp/libcrypto.so
#/Users/dhbm/Desktop/ndk/ndk20180723/app/src/main/cpp/libcrypto.a
)
3、直接 terminal 运行 cmake ,发现以下错误
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
log-lib
说明 log 库也没有找到!
4、先注释掉 target_link_libraries 里面的 ${log-lib}。先对付 libssl
5、同样 terminal 运行 cmake,没有报错,提示如下
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/dhbm/Desktop/ndk/ndk20180723/app
6、执行 Rebuild Project
../x86_64-linux-android/bin/ld: error: ../../../../src/main/cpp/libssl.so: incompatible targe
error: ../../../../src/main/cpp/libcrypto.so: incompatible target
*** 说明我从手机 copy 出来的 so 文件 和我的项目黄精不兼容
*** 同样,也说明我的 add_library 加上 set_target_properties,并且 so 文件使用了完整绝对路径是正确的了
7、复制我之前自行编译的 libssl.a 和 libcrypto.a 也放到 cpp 目录下,并修改 刚才的 so 为 .a 静态,SHARE 改为 STATIC
再次执行 Rebuild Project ,看到以下错误
error: ../../../../src/main/cpp/libssl.a: no archive symbol table (run ranlib)
error: ../../../../src/main/cpp/libcrypto.a: no archive symbol table (run ranlib)
百度得知:
.a是armv7或者其他不同平台下编译的,但现在NDK不支持armv7
找到源文件重新编译出.a文件
8、接下来:
1)、重新编译 openssl
2)、找找 log 库
3)、INCLUDE_DIRECTORIES 不知道对不对!
20180720 总算找到一个可以运行的 openssl 的 demo
1、直接 imort 该项目,build 会报错如下:
Your project contains C++ files but it is not using a supported native build
参考
https://blog.csdn.net/commshare/article/details/53186025
还有一个方法
https://blog.csdn.net/lanuage/article/details/53072303
在 app 的 build.gradle 加入以下部分
//added for jni begin
/*
ndk {
moduleName "testOpenSSL"
abiFilters "armeabi-v7a"
}
*/
sourceSets.main {
jni.srcDirs = []//disable automatic ndk-build call
jniLibs.srcDir "src/main/jnilibs"
}
//added for jni end
Rebuild 会报错:不止此 ndk 部分,干脆,注释掉!
再次 Rebuild ,居然是 ok 了!
2、run app 在 模拟器装载报错,可能是 api 太低,先使用我的 android 5.0 手机真机测试
OK!
但是 在 logcat 看到中文乱码,待处理!
3、转换 android.mk -> cmakelists.txt
20180703 xcode 重新来过openssl项目
1. 新建立一个 Command Line Project
2. 从 lxn (别人给我的他在 ubuntu 下的 openssl 1.0.2o以及他自己写的 client.c,server.c 等 ) 的目录拖入 libssl.a 、 libcrypto.a 和 include 目录
3. 从 lxn 拖入 client.c ,删除掉自己创建的 main.c
4. 编译执行,又看到红牌!!!而且是一大堆
Undefined symbols for architecture x86_64
5. 仔细检查我的 target 配置,看到 General 的 Linked Frameworks and Libraries
已经包含进去了以上 libssl.a 、 libcrypto.a,
检查client.c 里面也没有报语法错误(说明 include 正确)
6. 仔细核对之前正确过的项目,发现 prohject 的 building setting 里面
all Command 相差好多项目,怀疑是正确编译之后自动建立的
重新建立一个Command Line Project,并且直接运行,然后看到了其他项目,确认以上怀疑!
7. 既然配置都正确,语法都正确,为什么还是不对?回忆之前的努力,想起来可能是链接的库不是针对 Mac 编译的,对比一下正确的项目的 libssl.a 、 libcrypto.a文件,和从 lxn 拖过来的 libssl.a 、 libcrypto.a,发现问题了!大小都不一样!
8. 想起来之前是从 mac 系统已经安装运行的openssl 目录 copy 并拖放过来的
### openssl version
OpenSSL 1.0.2n 7 Dec 2017
### whereis openssl
/usr/bin/openssl
### 我的 openssl位置
/usr/local/Cellar/openssl/1.0.2n/include/openssl
### 设置 include (这是网上别人的建议,我操作没有成功,所以,直接整体目录拖过来的)
./configure --prefix=/usr/local CPPFLAGS="-I/usr/local/Cellar/openssl/1.0.2n/include" LDFLAGS="-I/usr/local/Cellar/openssl/1.0.2n/lib"
9. 重新建立新Command Line Project,拖放 mac 自己的 libssl.a 、 libcrypto.a 和 include
10. 拖放过来 client.c 以及对应的证书文件,修改 client.c 中证书文件路径
11. 运行!ok
## 总结:Undefined symbols for architecture x86_64 错误,链接的libssl.a 、 libcrypto.a库不是你的target平台的!
下一步,找 android 平台的 libssl.a 、 libcrypto.a
Mac openssl 开发环境测试
准备工作
1. 别人给我的他在 ubuntu 下的 openssl 1.0.2o以及他自己写的 client.c,server.c ,他生成的证书等
2. 我的重点在于搭建一个可以测试 client.c 程序的服务器环境
3. 把他提供的程序、证书都放到 /Users/dhbm/Desktop/lxn/lxntransfer/tests
创建一个 openssl 服务器
1、参考:http://www.cnblogs.com/aixiaoxiaoyu/articles/8796410.html
2、进入存放证书、公钥、私钥 的目录
服务端 (/Users/dhbm/Desktop/lxn/lxntransfer/tests)
cd /Users/dhbm/Desktop/lxn/lxntransfer/tests
3、openssl s_server -key server-key.pem -cert server-cert.pem
参数说明:
-cert filename
证书文件名
-key filename
私钥文件
运行结果:
Using default temp DH parameters
ACCEPT
建立客户端
连接到 openssl 服务器(Mac 的 openssl s_server缺省端口是 4433)
1、参考:http://www.cnblogs.com/aixiaoxiaoyu/articles/8796398.html
客户端证书位置 (/Users/dhbm/Desktop/lxn/lxntransfer/testc)
2、本机测试
openssl s_client -connect 127.0.0.1:4433
或者本机ip (我的ip是 192.168.1.100 )
openssl s_client -connect 192.168.1.100:4433
运行结果
Server is connect to you!
有个疑问:为什么不用加上 key cert 参数?自己就能找到?
4、连接另一个服务器,另一个端口测试
s_client -connect 192.168.1.166:5060
别人提供的 ubuntu 服务器,server.c编译运行在 192.168.1.166,端口是 5060
5、运行结果
没有带上参数的时候,错误信息
find a customer to try to connect
can not find the customer's certificate
6、完整命令链接另一个服务器
openssl s_client -connect 192.168.1.166:5060 -key client-key.pem -cert client-cert.pem
运行结果
Server is connect to you!
转载至链接:https://my.oschina.net/u/1440971/blog/1921076
android.mk 条件编译,android openSSL 的苦逼历程相关推荐
- Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...
- android.mk转换为android.bp
1.0 类似例子 android.mk大家都很熟悉了,就是android下编译模块的配置文件,可以理解为android makefile.从android N之后,我们发现好多模块下面没有了andro ...
- 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )
文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...
- 【Android.mk】android编译系统makefile文件Android.mk的写法
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$ ...
- android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍
模块描述变量: 下面的变量用于向编译系统描述你的模块.你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义.正如前面描写的那样,$(CL ...
- android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)
本文不作为ndk初学使用,只是对cpp等c++文件编译成so文件的过程中,参数含义,及ndk配置的解释.使用的技术比较旧. androidStudio使用gradle调用ndk-build工具编译c+ ...
- Android.mk 分析android buid工程需要的makefile知识点总结
1.0 make -C /home/wangxiancan/android -f build/core/main.mk all_modules -C 表示进入到某目录 执行(解析)其中的makefil ...
- 编写Android.mk把Android studio项目编译到AOSP源码中
前言: 在工作,我们利用Android studio开发apk是非常方便的,当我们要把工程代码放在android 源码中编译的时候,需要我们自己编写Andorid.mk 文件.以下内容是对Androi ...
- 记录一下在ROS里调用ORK的苦逼历程
ubuntu16系统下,ROS kinnect.是跟着这位大神的步骤走,但连连报错.ROS中的物体识别--ORK功能包的使用 1.运行 rosrun object_recognition_core ...
最新文章
- oracle中的cursor属性有哪些,Cursor语法及理解
- redis数据结构小结
- 6.824 2020 视频笔记五:Go Concurrency
- 拓端tecdat|R语言线性分类判别LDA和二次分类判别QDA实例
- 【软件安装】CuteFTP Pro安装过程(含安装包)
- 匈牙利算法及KM算法详解
- 毕业即失业,转行软件测试的辛酸泪只有自己知道
- 编译QT项目出现错误:error C2144: syntax error : 'void' should be preceded by ';'
- python调用百度AI接口识别营业执照
- 三天打鱼两天晒网的直接差距
- Excel技能之计数求和,让你成为高手之路的机车手
- Python|计算工资
- python 安卓模拟点击_python模拟android屏幕高频点击工具
- 追忆第一次南下深圳有哪些重大抉择(上)?
- PHP安装流程(带安装包)
- 你的Java代码对JIT编译友好么?
- uniapp中video标签设置controls显示问题
- 当我问 ChatGPT 能否推荐一下好用的 API 管理工具时?
- Advanced Duplicate Cleaner for Mac(高级重复文件清理软件)
- LINUX 网卡丢包故障