Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请使用ssl证书发送Dart https请求_Ssl_Https_Request_Dart_Certificate - Fatal编程技术网

请使用ssl证书发送Dart https请求

请使用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

我有下面的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/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数据库。使用NSS
certutil
工具操作数据库,该工具记录如下:

本例创建了一个包含三个证书的数据库,一个自签名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.
}