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

标签 ssl https request dart certificate

我有以下 Javascript 代码,当我使用 nodejs 运行它时,它运行良好。但是,我想写一些与 Dart 类似的东西。我浏览了 Dart 文档,但找不到任何示例。如果有人可以告诉我如何使用 Google Dart 重写以下内容,我将不胜感激。非常感谢!

var https = require('https');
var fs = require('fs');
var url = require('url');

var uri = "https://identitysso-api.betfair.com:443/api/certlogin";
var data = 'username=xxxxxxxx&password=xxxxxxxx';
var appKey = 'xxxxxxxxxxxxxx'

var options = url.parse(uri);
options.method = 'POST';
options.headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'X-Application': appKey
};
options.key = fs.readFileSync('client-2048.key');
options.cert = fs.readFileSync('client-2048.crt');
options.agent = new https.Agent(options);

var req = https.request(options, function(res) {
    console.log("statusCode:", res.statusCode);
    var responseData = "";
    res.on('data', function(d) {
        responseData += d;
    });
    res.on('end', function() {
        var response = JSON.parse(responseData);
        console.log("sessionToken:", response.sessionToken.replace(/\d/g, ''));
    });
    res.on('error', function(e) {
        console.error(e);
    });
});

req.end(data);

我有以下几点:-

import 'dart:io';

void main() {
    var uri = "https://identitysso-api.betfair.com:443/api/certlogin";
    var data = 'username=xxxxxxxx&password=xxxxxxxx';
    var appKey = 'xxxxxxxxxxxx';
    var method = 'POST';

    HttpClient client = new HttpClient();
    client.openUrl(method,Uri.parse(uri))
    .then((HttpClientRequest request) {
        request.headers.set(HttpHeaders.CONTENT_TYPE, 'application/x-www-form-urlencoded');
        request.headers.set('X-Application', appKey);
        request.write(data);
        return request.close();
     })
     .then((HttpClientResponse response) {
    // Process the response.
     });
}

但是在告诉您如何向 HttpClient 或 HttpRequest 添加证书的文档中找不到任何内容?任何帮助都非常感谢提前收到。

最佳答案

从 1.13.0 版开始,现在可以在 Dart 中像在 node.js 中一样轻松地在 HTTPS 请求中发送客户端证书。在发出 HTTPS 请求之前,可以将 PEM 格式的客户端证书和 key 添加到默认的 SecurityContext 对象。

Dart 现在已改用 BoringSSL,这是由 Google 维护的 OpenSSL 的一个分支。 BoringSSL 使用以 PEM 格式存储在文件中的 X509 证书(SSL 和 TLS 使用的证书)。 Dart 的旧版本使用 NSS,它有自己的证书和 key 数据库,由命令行工具维护。 Dart 更改了 SecureSocket 方法的一些参数,并添加了一个 SecurityContext 类。

SecurityContext.defaultContext 是一个对象,包含知名证书颁发机构的内置可信根,取自他们用于 Firefox 和 NSS 的 Mozilla 数据库。所以你的客户端应该使用这个对象,并将客户端证书和私钥添加到它,所以它们将被用来对请求它们的服务器进行身份验证:

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.
}

SecurityContext.useCertificateChain 和 SecurityContext.usePrivateKey 函数与用于设置服务器证书和 key 的函数相同,对于 SecureServerSocket,但是当上下文用于客户端连接时,它们指定要发送的客户端证书根据要求。

关于ssl - 请使用 ssl 证书发送 https 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388750/

相关文章:

ssl - Amazon Elastic Load Balancer SSL 证书安装方法

java - HttpsURLConnection 在调用 getInputStream() 时停止

android - HttpsURL 连接 : SSL resumption not working

c++ - 使用 libcurl 发送 "request payload"?

jakarta-ee - 如何在Java EE环境中实现请求限制?

multithreading - 来自多个线程的 OpenSSL SSL_read 和 SSL_write

javascript - Knex Heroku 错误 : self signed certificate

jquery - 如何从非 SSL 页面提交带有 SSL 的表单?

php - https、Jquery、PHP、Curl 和 document.cookie

java - 如果发生异常,则记录http请求正文