项目中要实现WSS Client,因此选择了websocketpp,在实现websocketpp自带的example时,编译错误,提示error: ‘ASN1_STRING_get0_data’ was not declared in this scope,解决后记录如下;
一、问题原因是使用的OpenSSL版本不兼容的问题
ASN1_STRING_get0_data 目前了解到的是在>1.0.1版本的OpenSSL中存在,但实际出问题的时候,服务器版本是Open SSL1.0.2.k,所以为了保证能解决问题,建议使用OpenSSL 1.1.0版本
友情提示:查看openssl 版本命令 【openssl version】
当openssl < 1.0.1时,ASN1_STRING_get0_data该方法不存在,作为替代是ASN1_STRING_data方法,如果碰到类似ASN1_STRING_data 未声明的情况,请把openssl版本降低
二、升级OPENSSL版本
升级操作可参考如下链接的操作步骤【转载】Linux openssl 升级、降级
在升级完成后执行cmake 命令
[root@tallive websocketpp]# cmake .
* C++11 support partially enabled due to GCC version 5.3.1* Configuring Boost
-- -- Using BOOST_ROOT
--
-- -- Include Directories
-- /usr/include
-- -- Library Directories
-- /usr/lib
-- -- Libraries
-- /usr/lib/libboost_system-mt.so
-- /usr/lib/libboost_thread-mt.so
-- -lpthread
-- /usr/lib/libboost_random-mt.so
-- /usr/lib/libboost_chrono-mt.so
-- /usr/lib/libboost_date_time-mt.so
-- /usr/lib/libboost_atomic-mt.so** websocketpp
** associative_storage
-- -- Build Type:
-- EXECUTABLE
** broadcast_server
-- -- Build Type:
-- EXECUTABLE
** debug_client
-- -- Build Type:
-- EXECUTABLE
** debug_server
-- -- Build Type:
-- EXECUTABLE
** echo_client
-- -- Build Type:
-- EXECUTABLE
** echo_server
-- -- Build Type:
-- EXECUTABLE
** echo_server_both
-- -- Build Type:
-- EXECUTABLE
** echo_server_tls
-- -- Build Type:
-- EXECUTABLE
** enriched_storage
-- -- Build Type:
-- EXECUTABLE
** external_io_service
-- -- Build Type:
-- EXECUTABLE
** handler_switch
-- -- Build Type:
-- EXECUTABLE
** iostream_server
-- -- Build Type:
-- EXECUTABLE
** print_client
-- -- Build Type:
-- EXECUTABLE
** print_client_tls
-- -- Build Type:
-- EXECUTABLE
** print_server
-- -- Build Type:
-- EXECUTABLE
** simple_broadcast_server
-- -- Build Type:
-- EXECUTABLE
** sip_client
-- -- Build Type:
-- EXECUTABLE
** subprotocol_server
-- -- Build Type:
-- EXECUTABLE
** telemetry_client
-- -- Build Type:
-- EXECUTABLE
** telemetry_server
-- -- Build Type:
-- EXECUTABLE
** testee_client
-- -- Build Type:
-- EXECUTABLE
** testee_server
-- -- Build Type:
-- EXECUTABLE
** utility_client
-- -- Build Type:
-- EXECUTABLE=========== Used Build Configuration =============
-- ENABLE_CPP11 = ON
-- BUILD_EXAMPLES = ON
-- BUILD_TESTS = OFF-- WEBSOCKETPP_ROOT = /vagrant/websocketpp
-- WEBSOCKETPP_BIN = /vagrant/websocketpp/bin
-- WEBSOCKETPP_LIB = /vagrant/websocketpp/lib
-- Install prefix = /usr/local-- WEBSOCKETPP_BOOST_LIBS = system;thread;random
-- WEBSOCKETPP_PLATFORM_LIBS = pthread;rt
-- WEBSOCKETPP_PLATFORM_TLS_LIBS = ssl;crypto-- OPENSSL_FOUND = TRUE
-- OPENSSL_INCLUDE_DIR = /usr/include
-- OPENSSL_LIBRARIES = /usr/lib64/libssl.so;/usr/lib64/libcrypto.so
-- OPENSSL_VERSION = 1.1.0l-- Configuring done
-- Generating done
-- Build files have been written to: /vagrant/websocketpp
[root@tallive websocketpp]#
重点关注OPENSSL_LIBRARIES 中指定的libssl.so 和 libcrypto.so的路径
需要通过strings命令来进一步确认使用的库版本是否正确
具体参考
[root@tallive websocketpp]# strings /usr/lib64/libssl.so | grep OpenSSL
OpenSSL 1.1.0l 10 Sep 2019[root@tallive websocketpp]# strings /usr/lib64/libcrypto.so | grep OpenSSL
OpenSSL_version_num
OpenSSL_version
DH_OpenSSL
DSA_OpenSSL
EC_KEY_OpenSSL
RAND_OpenSSL
RSA_PKCS1_OpenSSL
UI_OpenSSL
OpenSSL CMAC method
OpenSSL default
%s:%d: OpenSSL internal error: %s
OpenSSL 1.1.0l 10 Sep 2019
OpenSSL X9.42 DH method
OpenSSL PKCS#3 DH method
OpenSSL DH Method
OpenSSL DSA method
OpenSSL 'dlfcn' shared library method
OpenSSL EC algorithm
OpenSSL EC_KEY method
OpenSSL X25519 algorithm
OpenSSL HMAC method
You need to read the OpenSSL FAQ, https://www.openssl.org/docs/faq.html
OpenSSL RSA method
OpenSSL PKCS#1 RSA
OpenSSL default user interface
OpenSSL_version
RSA_PKCS1_OpenSSL
EC_KEY_OpenSSL
DSA_OpenSSL
DH_OpenSSL
OpenSSL_version_num
UI_OpenSSL
RAND_OpenSSL[root@tallive websocketpp]# strings /usr/lib64/libcrypto.so | grep ASN1_STRING_get0_data
ASN1_STRING_get0_data
ASN1_STRING_get0_data
通过上述命令确认当前使用的库正常,且libcrypto.so 库中包含ASN1_STRING_get0_data,代表升级成功,且库都生效
如果通过上述命令发现/usr/lib64/libssl.so 和 /usr/lib64/libcrypto.so 库版本不对,则需要重新建立软连接
[root@tallive websocketpp]# ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so
[root@tallive websocketpp]# ln -s /usr/local/ssl/lib/libssl.so.1.1 /usr/lib64/libssl.so
完成上述重新建软连接之后,在检查库是否正常,生效
生效后,再次执行如下命令,完成webscoketpp的编译工作,在/bin目录下生成example对应的可执行文件,自此可进行demo 运行和修改了
[root@tallive websocketpp]#cmake . -D BUILD_EXAMPLES=ON
[root@tallive websocketpp]#make clean && make -j4
[root@tallive websocketpp]# ls bin/
associative_storage debug_server echo_server_both external_io_service print_client simple_broadcast_server telemetry_client testee_server
broadcast_server echo_client echo_server_tls handler_switch print_client_tls sip_client telemetry_server utility_client
debug_client echo_server enriched_storage iostream_server print_server subprotocol_server testee_client