【HarmonyOS NEXT】鸿蒙https请求跳过证书校验
https请求前,进行自签名证书加载
1.运行报错: error:{"code":2300060,"message":"SSL peer certificate or SSH remote key was not OK"},显示无法校验服务器身份,
2. 导致这个错误码的原因可能有以下几种:
服务器证书过期或者未被信任:如果服务器证书过期或者未被信任,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
服务器证书链不完整:如果服务器证书链不完整,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
客户端时间与服务器时间不一致:如果客户端的系统时间与服务器的时间不一致,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
针对这些问题,可以采取以下措施:
更新服务器证书:如果服务器证书过期或者未被信任,需要更新服务器证书。
完整的证书链:确保服务器证书链完整,包括中间证书。
同步客户端和服务器时间:确保客户端和服务器时间同步。
3、可将自签名证书放在项目rawfile文件目录下,通过demo写入工程机系统,在请求时设置capath参数指定证书写入的沙箱路径进,看是否可请求到结果
应用自己的沙箱路径
/data/app/el2/100/base/{包名}/haps/entry/files
https请求跳过证书校验方法:
将p12转换成pem尝试,p12转换pem可参考如下命令
## 生成时如果p12证书有密码,需要输入密码
## 生成 key文件命令
openssl pkcs12 -in client.p12 -out key.pem -nocerts -nodes
## 生成 证书文件命令
openssl pkcs12 -in client.p12 -out crt.pem -clcerts -nokeys
示例代码
// 引入包名
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header: Object) => {
console.info('header: ' + JSON.stringify(header));
});
class Header {
public contentType: string;
constructor(contentType: string) {
this.contentType = contentType;
}
}
httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
"EXAMPLE_URL",
{
method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
// 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
extraData: 'data to send',
expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
usingCache: true, // 可选,默认为true
priority: 1, // 可选,默认为1
// 开发者根据自身业务需要添加header字段
header: new Header('application/json'),
readTimeout: 60000, // 可选,默认为60000ms
connectTimeout: 60000, // 可选,默认为60000ms
usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性
caPath: '/path/to/cacert.pem', // 可选,默认使用系统预设CA证书,自API 10开始支持该属性
clientCert: { // 可选,默认不使用客户端证书,自API 11开始支持该属性
certPath: '/path/to/client.pem', // 默认不使用客户端证书,自API 11开始支持该属性
keyPath: '/path/to/client.key', // 若证书包含Key信息,传入空字符串,自API 11开始支持该属性
certType: http.CertType.PEM, // 可选,默认使用PEM,自API 11开始支持该属性
keyPassword: "passwordToKey" // 可选,输入key文件的密码,自API 11开始支持该属性
},
multiFormDataList: [ // 可选,仅当Header中,'content-Type'为'multipart/form-data'时生效,自API 11开始支持该属性
{
name: "Part1", // 数据名,自API 11开始支持该属性
contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
data: 'Example data', // 可选,数据内容,自API 11开始支持该属性
remoteFileName: 'example.txt' // 可选,自API 11开始支持该属性
}, {
name: "Part2", // 数据名,自API 11开始支持该属性
contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
// data/app/el2/100/base/com.example.myapplication/haps/entry/files/fileName.txt
filePath: `${getContext(this).filesDir}/fileName.txt`, // 可选,传入文件路径,自API 11开始支持该属性
remoteFileName: 'fileName.txt' // 可选,自API 11开始支持该属性
}
]
},
(err: BusinessError, data: http.HttpResponse) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info('Result:' + JSON.stringify(data.result));
console.info('code:' + JSON.stringify(data.responseCode));
console.info('type:' + JSON.stringify(data.resultType));
// data.header为HTTP响应头,可根据业务需要进行解析
console.info('header:' + JSON.stringify(data.header));
console.info('cookies:' + JSON.stringify(data.cookies)); // 自API version 8开始支持cookie
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。
httpRequest.destroy();
} else {
console.info('error:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。
httpRequest.destroy();
}
});
DnsOverHttpsConfiguration
DnsOverHttpsConfiguration接口允许开发人员配置HTTPS上的DNS(DOH)设置,从而通过HTTPS端点实现安全的DNS解析。
系统能力:SystemCapability.Collaboration.RemoteCommunication
起始版本:4.1.0(11)
属性:
名称 | 类型 | 只读 | 必填 | 说明 |
---|---|---|---|---|
url | 否 | 是 | DOH端点的URL或字符串表示形式。 | |
skipCertificatesValidation | boolean | 否 | 否 | 指定是否跳过DOH终结点的SSL/TLS证书验证。默认值为false。 |
示例:
// Configure DNS over HTTPS settings
const dohConfig: rcp.DnsOverHttpsConfiguration = {
url: "https://dns.example.com/dns-query",
skipCertificatesValidation: true,
};
// Use the DNS over HTTPS configuration in the session creation
const sessionWithDoh = rcp.createSession({ requestConfiguration: { dns: { dnsOverHttps: dohConfig } } });
网络请求静态配置
Configuration
Configuration接口包含一组配置参数,开发人员可以利用这些参数来微调会话中HTTP请求的行为。这包括传输、跟踪、代理、DNS和安全配置的设置。
系统能力:SystemCapability.Collaboration.RemoteCommunication
起始版本:4.1.0(11)
属性:
名称 | 类型 | 只读 | 必填 | 说明 |
---|---|---|---|---|
transfer | 否 | 否 | 配置与HTTP请求期间的数据传输相关的各个方面,例如自动重定向和超时设置。 | |
tracing | 否 | 否 | 使开发人员能够在HTTP请求期间捕获详细的跟踪信息,有助于调试和性能分析。 | |
proxy | 否 | 否 | 配置会话的代理设置,允许开发人员定义'system'、'no-proxy'或WebProxy配置。 | |
dns | 否 | 否 | 指定与DNS相关的配置,包括自定义DNS规则和通过HTTPS使用DNS的选项。 | |
security | 否 | 否 | 包括用于处理安全相关方面的设置,如证书和服务器身份验证。 |
示例:
const requestConfig: rcp.Configuration = {
transfer: {
autoRedirect: true,
timeout: {
connectMs: 5000,
transferMs: 10000,
},
assumesHTTP3Capable: true,
pathPreference: "cellular",
},
tracing: {
verbose: true,
},
proxy: "system",
dns: {
dnsRules: [
{ host: "https://example.com", port: 443, ipAddresses: ["192.168.1.1", "192.168.1.2"] }
]
},
security: {
certificate: {
content: "-----BEGIN CERTIFICATE-----\n...",
type: "PEM",
key: "-----BEGIN PRIVATE KEY-----\n...",
keyPassword: "your-password",
},
serverAuthentication: {
credential: {
username: "your-username",
password: "your-password",
},
authenticationType: "basic",
},
},
};
// Use the configuration in the session creation
const session = rcp.createSession({ requestConfiguration: requestConfig });
在网络请求中获取相应的跟踪数据
TransferConfiguration
TransferConfiguration接口为开发人员提供了一组选项,用于调整会话中HTTP请求期间的数据传输行为。这包括与自动重定向和超时配置相关的设置。
系统能力:SystemCapability.Collaboration.RemoteCommunication
起始版本:4.1.0(11)
属性:
名称 | 类型 | 只读 | 必填 | 说明 |
---|---|---|---|---|
autoRedirect | boolean | 否 | 否 | 指定HTTP客户端是否应自动遵循重定向。如果设置为true,客户端将自动遵循HTTP重定向;否则,它不会。默认值为true。 |
timeout | 否 | 否 | 配置HTTP请求的超时值,允许开发人员定义连接和传输数据所允许的最长时间。如果未设置,则使用默认时间。 | |
assumesHTTP3Capable | boolean | 否 | 否 | 指定连接是否具有HTTP/3功能。
|
pathPreference | 否 | 否 | 这只是调用者的一个建议,系统决定使用哪个路径。可以是'自动'或'蜂窝'路径。默认为'自动'路径。 | |
serviceType | 否 | 否 | 服务类型。默认为undefined。 |
示例:
const transferConfig: rcp.TransferConfiguration = {
autoRedirect: true,
timeout: {
connectMs: 5000,
transferMs: 10000,
},
assumesHTTP3Capable: true,
pathPreference: "cellular",
};
// Use the configuration in the session creation
const session = rcp.createSession({ requestConfiguration: { transfer: transferConfig } });
原文地址:https://blog.csdn.net/wu1004019946/article/details/139768393
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!