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 的苦逼历程相关推荐

  1. Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App

    目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...

  2. android.mk转换为android.bp

    1.0 类似例子 android.mk大家都很熟悉了,就是android下编译模块的配置文件,可以理解为android makefile.从android N之后,我们发现好多模块下面没有了andro ...

  3. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

    文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...

  4. 【Android.mk】android编译系统makefile文件Android.mk的写法

    (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$ ...

  5. android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍

    模块描述变量: 下面的变量用于向编译系统描述你的模块.你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义.正如前面描写的那样,$(CL ...

  6. android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)

    本文不作为ndk初学使用,只是对cpp等c++文件编译成so文件的过程中,参数含义,及ndk配置的解释.使用的技术比较旧. androidStudio使用gradle调用ndk-build工具编译c+ ...

  7. Android.mk 分析android buid工程需要的makefile知识点总结

    1.0 make -C /home/wangxiancan/android -f build/core/main.mk all_modules -C 表示进入到某目录 执行(解析)其中的makefil ...

  8. 编写Android.mk把Android studio项目编译到AOSP源码中

    前言: 在工作,我们利用Android studio开发apk是非常方便的,当我们要把工程代码放在android 源码中编译的时候,需要我们自己编写Andorid.mk 文件.以下内容是对Androi ...

  9. 记录一下在ROS里调用ORK的苦逼历程

    ubuntu16系统下,ROS kinnect.是跟着这位大神的步骤走,但连连报错.ROS中的物体识别--ORK功能包的使用 1.运行  rosrun object_recognition_core ...

最新文章

  1. oracle中的cursor属性有哪些,Cursor语法及理解
  2. redis数据结构小结
  3. 6.824 2020 视频笔记五:Go Concurrency
  4. 拓端tecdat|R语言线性分类判别LDA和二次分类判别QDA实例
  5. 【软件安装】CuteFTP Pro安装过程(含安装包)
  6. 匈牙利算法及KM算法详解
  7. 毕业即失业,转行软件测试的辛酸泪只有自己知道
  8. 编译QT项目出现错误:error C2144: syntax error : 'void' should be preceded by ';'
  9. python调用百度AI接口识别营业执照
  10. 三天打鱼两天晒网的直接差距
  11. Excel技能之计数求和,让你成为高手之路的机车手
  12. Python|计算工资
  13. python 安卓模拟点击_python模拟android屏幕高频点击工具
  14. 追忆第一次南下深圳有哪些重大抉择(上)?
  15. PHP安装流程(带安装包)
  16. 你的Java代码对JIT编译友好么?
  17. uniapp中video标签设置controls显示问题
  18. 当我问 ChatGPT 能否推荐一下好用的 API 管理工具时?
  19. Advanced Duplicate Cleane‪r‬ for Mac(高级重复文件清理软件)
  20. LINUX 网卡丢包故障

热门文章

  1. 关于用python爬取自如网信息的价格问题(已解决)
  2. github用的jekyll是什么意思?
  3. 《大话设计模式》读后感
  4. EntityFramework 的5种状态-简记
  5. js 事件回调函数的对象属性说明:clientX、screenX、offsetX、pageX
  6. Java小游戏--舒尔特方格
  7. APICloud教程
  8. 移动web适配的方式
  9. netmiko链接思科WLC无线控制器
  10. 树莓派frp内网穿透