利用 boost::asio::ssl C/C++ 检查SSL/PEM证书文件的有效性

我们可以通过 boost::asio::ssl::context (SSL上下文)对象实例成员接口来检查SSL证书文件的有效性。

1、use_certificate_chain_file 使用证书链文件(CA*)

2、use_certificate_file 使用证书文件(公钥)

3、use_private_key_file 使用证书文件(私钥)

cpp 复制代码
        bool SSL::VerifySslCertificate(
            const std::string& certificate_file,
            const std::string& certificate_key_file,
            const std::string& certificate_chain_file) noexcept {

            typedef xxx::io::File                       File;
            typedef xxx::io::FileAccess                 FileAccess;

            if (certificate_file.empty() ||
                certificate_key_file.empty() ||
                certificate_chain_file.empty()) {
                return false;
            }

            if (!File::CanAccess(certificate_file.data(), FileAccess::Read) ||
                !File::CanAccess(certificate_key_file.data(), FileAccess::Read) ||
                !File::CanAccess(certificate_chain_file.data(), FileAccess::Read)) {
                return false;
            }

            std::shared_ptr<boost::asio::ssl::context> ssl_context = make_shared_object<boost::asio::ssl::context>(
                xxx::ssl::SSL::SSL_S_METHOD(xxx::ssl::SSL::SSL_METHOD::ssl));
            if (!ssl_context) {
                return false;
            }

            boost::system::error_code ec;
            /*ssl_context_->set_options(boost::asio::ssl::context::default_workarounds |
                boost::asio::ssl::context::no_sslv2 |
                boost::asio::ssl::context::no_sslv3 |
                boost::asio::ssl::context::single_dh_use);*/
            ssl_context->use_certificate_chain_file(certificate_chain_file, ec);
            if (ec) {
                return false;
            }

            ssl_context->use_certificate_file(certificate_file, boost::asio::ssl::context::file_format::pem, ec);
            if (ec) {
                return false;
            }

            ssl_context->use_private_key_file(certificate_key_file, boost::asio::ssl::context::file_format::pem, ec);
            return ec ? false : true;
        }

        boost::asio::ssl::context::method SSL::SSL_S_METHOD(int method) noexcept {
            switch (method) {
            case SSL_METHOD::tlsv13:
                return boost::asio::ssl::context::tlsv13_server;
            case SSL_METHOD::tlsv12:
                return boost::asio::ssl::context::tlsv12_server;
            case SSL_METHOD::tlsv11:
                return boost::asio::ssl::context::tlsv11_server;
            case SSL_METHOD::tls:
                return boost::asio::ssl::context::tls_server;
            case SSL_METHOD::sslv23:
                return boost::asio::ssl::context::sslv23_server;
            case SSL_METHOD::sslv3:
                return boost::asio::ssl::context::sslv3_server;
            case SSL_METHOD::sslv2:
                return boost::asio::ssl::context::sslv2_server;
            default:
                return boost::asio::ssl::context::tlsv12_server;
            };
        }
相关推荐
笑衬人心。21 分钟前
HTTPS详解:原理 + 加解密过程 + 面试问答
java·网络协议·http·面试·https
bing_15837 分钟前
MQTT 和 HTTP 有什么本质区别?
网络·网络协议·http
杨浦老苏2 小时前
Docker端口映射查看工具Dockpeek
网络·docker·群晖
未来之窗软件服务2 小时前
通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
网络·网络协议·http·仙盟创梦ide·东方仙盟·硬件接入
醉方休3 小时前
TCP、HTTP/1.1 和HTTP/2 协议
网络协议·tcp/ip·http
创小匠3 小时前
创客匠人解析创始人 IP 定位:从专业度到用户心智的占领之道
网络·网络协议·tcp/ip
车载测试工程师4 小时前
车载以太网网络测试-29【SOME/IP-SD】-SD状态机
网络·网络协议·tcp/ip·车载系统·php
高兴达4 小时前
RPC--自定义注解注册发布服务
网络·网络协议·rpc
lang201509285 小时前
Reactor ConnectableFlux支持多订阅者
java·网络
在下Z.5 小时前
利用TCP协议,创建一个多人聊天室
网络·网络协议·tcp/ip