请使用ssl证书发送Dart https请求
我有下面的Javascript代码,当我使用nodejs运行它时,它运行得很好。然而,我想写一些与Dart类似的东西。我查阅了Dart文档,没有找到任何示例。如果有人能告诉我如何使用GoogleDart重写以下内容,我将不胜感激。非常感谢请使用ssl证书发送Dart https请求,ssl,https,request,dart,certificate,Ssl,Https,Request,Dart,Certificate,我有下面的Javascript代码,当我使用nodejs运行它时,它运行得很好。然而,我想写一些与Dart类似的东西。我查阅了Dart文档,没有找到任何示例。如果有人能告诉我如何使用GoogleDart重写以下内容,我将不胜感激。非常感谢 var https=require('https'); var fs=需要('fs'); var url=require('url'); var uri=”https://identitysso-api.betfair.com:443/api/certlogi
var https=require('https');
var fs=需要('fs');
var url=require('url');
var uri=”https://identitysso-api.betfair.com:443/api/certlogin";
变量数据='username=xxxxxxxx&password=xxxxxxxx';
var appKey='xxxxxxxxxxxxx'
var options=url.parse(uri);
options.method='POST';
options.headers={
“内容类型”:“应用程序/x-www-form-urlencoded”,
“X应用程序”:appKey
};
options.key=fs.readFileSync('client-2048.key');
options.cert=fs.readFileSync('client-2048.crt');
options.agent=新的https.agent(选项);
var req=https.request(选项、函数(res){
console.log(“状态码:”,res.statusCode);
var responseData=“”;
res.on('数据',功能(d){
响应数据+=d;
});
res.on('end',function(){
var response=JSON.parse(responseData);
log(“sessionToken:”,response.sessionToken.replace(/\d/g');
});
res.on('错误',函数(e){
控制台错误(e);
});
});
请求结束(数据);
我已经做到了以下几点:-
导入'dart:io';
void main(){
var uri=”https://identitysso-api.betfair.com:443/api/certlogin";
变量数据='username=xxxxxxxx&password=xxxxxxxx';
var-appKey='xxxxxxxxxxx';
var方法='POST';
HttpClient=新的HttpClient();
openUrl(方法,Uri.parse(Uri))
.然后((HttpClientRequest请求){
request.headers.set(HttpHeaders.CONTENT_TYPE,'application/x-www-form-urlencoded');
request.headers.set('X-Application',appKey);
请求。写入(数据);
返回请求。close();
})
.然后((HttpClientResponse响应){
//处理响应。
});
}
但是在文档中找不到它告诉您如何向HttpClient或HttpRequest添加证书的任何内容??感谢您的帮助。可以将客户端证书与dart:io
HTTPS请求一起使用。然而,由于在Dart中实现SSL/TLS的方式,它有点复杂
Dart将Mozilla NSS库用于SSL/TLS。NSS将其所有密钥和证书存储在数据库中。SecureSocket.initialize
调用用于选择要使用的NSS数据库。如果未指定数据库,则将使用内置数据库。内置数据库仅包含受信任的根证书
要使用客户端证书,需要使用证书和密钥创建NSS数据库。使用NSScertutil
工具操作数据库,该工具记录如下:
本例创建了一个包含三个证书的数据库,一个自签名CA、一个本地主机的服务器证书和一个客户端证书。使用testtest
作为密码
$mkdir certdb
$certutil-N-dsql:certdb
$certutil-S-S“CN=Example CA”-n my CA cert-x-t“TCu,u,u”-5 sslCA-m 1234-d sql:certdb
答案9和N
$certutil-S-S“CN=localhost”-n我的服务器证书-c“我的ca证书”-t“u,u,u”-m 730-d sql:certdb
$certutil-S-S“CN=sgjesse”-n我的客户证书-c“我的ca证书”-t“Pu,u,u”-m 731-d sql:certdb
然后可以运行此服务器:
导入“dart:async”;
导入“dart:io”;
无效发球{
HttpServer.bindSecure('localhost',
8080,
certificateName:“我的服务器证书”,
requestClientCertificate:true)。然后((服务器){
侦听((HttpRequest请求){
if(request.certificate!=null){
打印('Client certificate${request.certificate.subject}');
}否则{
打印(“无客户证书”);
}
请求。响应。写(“你好”);
request.response.close();
});
});
}
void InitializeSSL(){
var testPkcertDatabase=Platform.script.resolve('certdb').toFilePath();
初始化(数据库:testPkcertDatabase,
密码:“testtest”);
}
void main(){
初始化ssl();
发球();
}
这位客户:
导入“dart:async”;
导入“dart:io”;
无效请求(){
HttpClient=新的HttpClient();
client.getUrl(Uri.parse(“https://localhost:8080/"))
.然后((请求)=>request.close())
.然后((回应){
打印('Subject:${response.certificate.Subject}');
打印('Issuer:${response.certificate.Issuer}');
返回response.transform(UTF8.decoder).join(“”);
})
.然后(打印);
}
void InitializeSSL(){
var testPkcertDatabase=Platform.script.resolve('certdb').toFilePath();
初始化(数据库:testPkcertDatabase,
密码:“testtest”);
}
void main(){
初始化ssl();
请求();
}
希望客户机能够提供客户机证书。但是,这依赖于NSS选择客户端证书,我不确定这方面的规则。如果使用SecureSocket
,则可以显式选择客户端证书,但这在HTTPS中目前是不可能的,请参阅
下面是一个使用SecureSocket
的客户端:
导入“dart:async”;
导入“dart:io”;
无效请求(){
SecureSocket.connect('localhost',
8080,
sendClientCertificate:true,
certificateName:“我的客户证书”)。然后((套接字){
socket.write(“GET/HTTP/1.0\r\n\r\n”);
插座。听(打印);
});
}
void InitializeSSL(){
var testPkcertDatabase=Platform.script.resolve('certdb').toFilePath();
初始化(数据库:testPkcertDatabase,
密码:'
Future postWithClientCertificate() async {
var context = SecurityContext.defaultContext;
context.useCertificateChain('client-2048.crt');
context.usePrivateKey('client-2048.key',
password:'keyfile_password');
HttpClient client = new HttpClient(context: context);
// The rest of this code comes from your question.
var uri = "https://identitysso-api.betfair.com:443/api/certlogin";
var data = 'username=xxxxxxxx&password=xxxxxxxx';
var appKey = 'xxxxxxxxxxxx';
var method = 'POST';
var request = await client.openUrl(method,Uri.parse(uri))
request.headers.set(HttpHeaders.CONTENT_TYPE,
'application/x-www-form-urlencoded');
request.headers.set('X-Application', appKey);
request.write(data);
var response = await request.close();
// Process the response.
}