tp6阿里云短信 window 报 cURL error 60: SSL certificate problem: unable to get local issuer certificate

本文记录了一位开发者在Windows环境下使用PHP SDK配置阿里云短信服务的过程,遇到了一些困难,但最终成功实现。代码示例展示了如何创建客户端、发送短信及测试API。同时,提到了CA证书的下载与配置,确保HTTPS安全连接。

序:帮客户接一个阿里云短信验证码提醒,新版的SDK,一下,折磨简单,在Windows上搞的差点心力交瘁,差点怀疑自己了,还好,收工下班

代码:

// 阿里云短信
public static function createClient($accessKeyId, $accessKeySecret){
    $config = new Config([
        "accessKeyId" => $accessKeyId,
        "accessKeySecret" => $accessKeySecret
    ]);
    // 访问的域名
    $config -> endpoint = "dysmsapi.aliyuncs.com";
    return new Dysmsapi($config);
}
public static function smsTemp($mobile,$code){
    $client = self::createClient(SMS_ID,SMS_SECRET);
    $sendSmsRequest = new SendSmsRequest([
        "signName" => SIGN_NAME,
        "templateCode" => SMS_CODE,
        "phoneNumbers" => $mobile,
        "templateParam" => "{\"code\":\"$code\"}"
    ]);
    // 复制代码运行请自行打印 API 的返回值
    return $client->sendSms($sendSmsRequest);
}
// 测试 API
public function test($mobile,$code){
    $res = self::smsTemp($mobile,$code);
    if($res->body->code == "OK") {
        return "success";
    }
    return 'fail
### Spring 应用中解决 cURL 错误 60 的方法 当遇到 `cURL error 60: SSL certificate problem: unable to get local issuer certificate` 错误时,这通常意味着客户端未能验证服务器的SSL证书。对于Spring应用程序而言,可以通过多种方式解决问题。 #### 方法一:安装并配置全局CA证书 为了使Java环境能够识别和信任特定的根证书颁发机构(CA),可以将受信的CA证书导入JVM的信任库中。具体操作如下: 1. 下载最新的 CA Bundle 文件(例如 cacert.pem),可从官方源获取[^4]。 2. 将该文件转换成适合 Java 使用的形式,即 JKS 或 PEM 格式的 keystore 文件。使用 keytool 工具完成这一过程: ```bash keytool -importcert -file /path/to/cacert.pem -alias my_ca_alias -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit ``` 3. 修改 JVM 启动参数以指向新的 trustStore 路径(如果需要的话)。可以在启动脚本里加入 `-Djavax.net.ssl.trustStore=/path/to/truststore.jks` 和 `-Djavax.net.ssl.trustStorePassword=yourpassword` 参数。 #### 方法二:禁用SSL验证(仅限测试) 虽然不推荐用于生产环境中,但在某些情况下可能希望暂时绕过SSL验证来进行调试或内部网络中的快速原型设计。可通过自定义 RestTemplate 来实现这一点: ```java @Bean public RestTemplate restTemplate() throws Exception { TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() .loadTrustMaterial(null, acceptingTrustStrategy) .build(); SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setHttpClient(httpClient); return new RestTemplate(requestFactory); } ``` 这种方法会忽略所有的SSL认证失败情况,因此只应在绝对必要的情况下采用,并且绝不可部署于公开互联网上运行的服务之中。 #### 方法三:指定单个请求使用的CA证书 针对个别 HTTP 请求,也可以单独为其提供可信的 CA 证书链而无需更改整个系统的设置。下面是一个基于 Apache HttpClient 实现的例子: ```java // 加载PEM格式的CA证书作为输入流 InputStream caCertStream = getClass().getResourceAsStream("/path/to/your-ca-cert.pem"); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); try (BufferedInputStream bis = new BufferedInputStream(caCertStream)) { CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(bis); ks.load(null); // 初始化为空密钥存储区 ks.setCertificateEntry("ca", cert); } String algorithm = Security.getProperty("ssl.TrustManagerFactory.algorithm"); TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); tmf.init(ks); SSLContext ctx = SSLContext.getInstance("TLSv1.2"); ctx.init(null, tmf.getTrustManagers(), null); CloseableHttpClient client = HttpClients.custom() .setSSLContext(ctx) .build(); HttpGet httpGet = new HttpGet("https://example.com/"); HttpResponse response = client.execute(httpGet); System.out.println(response.getStatusLine()); client.close(); ``` 上述代码片段展示了如何创建一个带有预加载CA证书的信任管理器工厂实例,并将其应用于单一HTTP GET请求中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸曦穆泽

您的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值