package cn.iocoder.yudao.module.pms.websocket;

import lombok.extern.slf4j.Slf4j;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

/**
 * WSS 客户端 SSL 配置工具（适配 Nginx 代理的证书校验）
 */
@Slf4j
public class WssSslConfigUtil {

    /**
     * 创建忽略证书校验的 SSL 上下文（适配 Nginx 自签名证书/内网证书场景）
     * 生产环境建议替换为信任指定证书的配置
     */
    public static SSLContext createIgnoreVerifySSLContext() {
        try {
            // 构建信任管理器（忽略证书校验）
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] chain, String authType) {}

                        @Override
                        public void checkServerTrusted(X509Certificate[] chain, String authType) {}

                        @Override
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }
                    }
            };
            // 初始化 SSL 上下文
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            return sslContext;
        } catch (Exception e) {
            log.error("创建 WSS SSL 上下文失败", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取 SSL 参数（适配 Nginx 代理的 SNI 扩展）
     */
    public static SSLParameters getSslParameters() {
        SSLParameters sslParams = new SSLParameters();
        // 启用 SNI（Server Name Indication），适配 Nginx 多域名代理场景
        sslParams.setEndpointIdentificationAlgorithm("HTTPS");
        return sslParams;
    }
}