操作系统:Windows 10
Node.js 版本:node-v8.11.4-win-x64
node-forge 版本:0.7.7-dev
大家,我在尝试创建 Node.js https 服务器时遇到了困难。
服务器背后的想法是它仅适用于本地环回请求。
考虑到这一点并出于隐私考虑,我想到了在每次服务器重新启动时更新的一次性自签名证书。
根据建议,我尝试使用 node-forge 模块来生成一次性证书。
在https://www.npmjs.com/package/node-forge阅读他们的说明,我得到了一个非常简单的代码:
var https = require('https');
var forge = require('node-forge');
forge.options.usePureJavaScript = true;
var pki = forge.pki;
var keys = pki.rsa.generateKeyPair(2048);
var cert = pki.createCertificate();
cert.publicKey = keys.publicKey;
cert.serialNumber = '01';
cert.validity.notBefore = new Date();
cert.validity.notAfter = new Date();
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear()+1);
var attrs = [
{name:'commonName',value:'example.org'}
,{name:'countryName',value:'US'}
,{shortName:'ST',value:'Virginia'}
,{name:'localityName',value:'Blacksburg'}
,{name:'organizationName',value:'Test'}
,{shortName:'OU',value:'Test'}
];
cert.setSubject(attrs);
cert.setIssuer(attrs);
cert.sign(keys.privateKey);
var pem_pkey = pki.publicKeyToPem(keys.publicKey);
var pem_cert = pki.certificateToPem(cert);
console.log(pem_pkey);
console.log(pem_cert);
https.createServer( …Run Code Online (Sandbox Code Playgroud) 目标是在电子应用程序的主流程中自定义证书验证,以便在开发和测试条件下与自签名证书和不匹配的主机名一起使用。APIelectron.net提供了提供对象的选项Session,该对象具有setCertificateVerifyProc方法。但是,我使用该方法注册的回调永远不会被调用。
这里有一个相关的问题:如何信任来自电子应用程序的自签名证书?
然而,该问题所接受的答案仅适用于渲染过程。事实上,在主进程上,事件certificate-error从未被发出。
我知道还有一些关于同一主题的其他问题,但是这些问题都不等于我的具体问题。
HttpURLConnection在我的 Android 应用程序中,我通过一些 RESTful 端点发出 Http 请求。其中一些端点使用自签名证书,其他端点则不使用。因此,我需要一种方法将自定义 KeyStore 添加到默认 HttpURLConnection 行为。
这是我现在的代码:
try {
KeyStore keyStore = getKeyStore(context);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "pasword".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
} catch (KeyStoreException | IOException | CertificateException | NoSuchAlgorithmException | UnrecoverableKeyException | KeyManagementException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但仅适用于自签名证书,任何其他请求都会产生java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
因此,我正在寻找一种方法让 HttpURLConnection 识别自定义自签名证书而不破坏正常行为。
我真的很难为与主机名不匹配的自签名服务器证书配置 Apache Camel https4。
[Do. 2020 16 Juli 13:13:19] [DEBUG] org.apache.camel.processor.Pipeline () - Message exchange has failed: so breaking out of pipeline for exchange: Exchange[ID-lvm-cdbservice-01ct-1594888044674-0-15551] Exception: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)
这就是为什么我创建了一个自定义 HttpClientConfigurer,如 apache Camel http 配置中所述。但是这个配置器似乎不适用于我的路由?!有人知道为什么吗?
在某些时候使用了configureHttpClient方法
[Do. 2020 16 Juli 10:27:25] [INFO ] com.test.SelfSignedHttpClientConfigurer () - Using SelfSignedHttpClientConfigurer...
[Do. 2020 16 Juli 10:27:25] [INFO ] com.test.SelfSignedHttpClientConfigurer () - ... HttpClient configured!
Run Code Online (Sandbox Code Playgroud)
但协议没有改变。这就是为什么我猜它没有用于我的路线。
available protocols [[TLSv1.3, TLSv1.2, TLSv1.1, TLSv1]], …Run Code Online (Sandbox Code Playgroud) 使用自签名证书有多安全?据我了解,如果我没有来自权威机构的证书,攻击者可能会伪装成我的服务器.这有很大的风险吗?
我应该为Subversion购买证书吗?
我有一个桌面产品,它使用嵌入式网络服务器,它将使用自签名证书.
有什么东西可以放在一个网页中,可以检测到他们没有将根CA添加到他们的可信列表中,并显示链接或DIV或指示他们如何操作的东西?
我想也许是有安装CA的指令的DIV,以及运行一些测试的Javascript(尝试访问没有内部警告的东西?),如果测试成功,则隐藏DIV.或类似的东西...
来自辉煌的SO社区的任何想法?:)
我正在开发一个 Android 应用程序,我需要访问一个 HTTPS 地址。我正在使用 Volley 请求我的数据,但现在出现此错误com.android.volley.NoConnectionError: java.io.IOException: Hostname '<address>' was not verified
为了获得 SSL 工厂,我这样做:
private static SSLSocketFactory getSocketFactory() {
SSLSocketFactory socketFactory = null;
try {
final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
final BufferedInputStream bis = new BufferedInputStream(sContext.getResources().openRawResource(R.raw.cert)) ;
Certificate certificate;
try {
certificate = certificateFactory.generateCertificate(bis);
} finally {
bis.close();
}
final String keyStoreType = KeyStore.getDefaultType();
final KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", certificate);
final String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
final SSLContext sslContext = …Run Code Online (Sandbox Code Playgroud) 我正在使用 Postman 来测试我的 API。
当我在 http 中调用我的服务器时,它在 dev env 中运行良好。但是在验收测试平台上,服务器在 https 中,我们使用的是自签名证书。
当我尝试通过 Postman 拨打电话时,我收到“无法得到任何响应”,它写在 SSL 连接被阻止的下面,并带有指向此页面的链接。
然而,正如评论中所通知的,这不再适用于自签名证书和最新的 chrome 版本。有关信息,我正在使用版本 59.0.3071.115(构建官方)(64 位)
当我进入谷歌设置,然后证书: chrome://settings/certificates 我尝试导入授权证书,我收到一个错误弹出框,说我的授权不是证书授权,它不允许我导入它。
当我在 linux 上时,我尝试做那里详述的事情:https : //superuser.com/questions/1201552/not-a-certification-authority-while-importing-self-signed-certificate 但即使我看到我打电话时的证书
certutil -d sql:$HOME/.pki/nssdb -L
Run Code Online (Sandbox Code Playgroud)
它仍然不允许我在谷歌中导入它。
那么如何在 linux 下通过 Postman 使用自签名证书呢?
编辑:我使用的是 Chrome 网上商店中缺少 SSL 支持的版本。下载了独立的,正如@Pratik Mandrekar 所写,它运行良好!
我有一个gitlab CI设置,我想构建和推送docker镜像,第一个问题是我的nexus repo不是https.实际的错误消息是这样的:
来自守护程序的错误响应:获取http://some.host:port/v2/:http:server向HTTPS客户端发出HTTP响应
要构建docker镜像我们使用docker:latestimage,我找不到将主机添加为不安全注册表的方法.gitlab-ci.yml
所以自我签署了我的nexus存储库,希望它能解决,但它也没有用,并提供以下错误消息:
来自守护程序的错误响应:获取https://some.host:port/v2/:x509:由未知权限签名的证书
这是我目前的CI设置:
image: docker:latest
services:
- docker:dind
before_script:
- docker info
- docker login -u USER -p PASSWORD some.host:port
stages:
- build
build-image:
stage: build
script:
- docker build -t some.host:port/image:alpine .
- docker push some.host:port/image:alpine
only:
- master
when: manual
Run Code Online (Sandbox Code Playgroud)
那么有一个简单的解决方案或现有的docker镜像我可以配置不安全的注册表可能是一些docker magic with command line我真的需要创建一个自己的图像来解决这个问题吗?
我在 Ubuntu 上使用 Firefox 59.0.1,在访问我的开发环境时看到以下错误,该环境位于自签名 SSL 证书后面。
您的连接不安全
crmpicco.dev 的所有者错误地配置了他们的网站。为保护您的信息不被盗用,Firefox 未连接到本网站。
该站点使用 HTTP 严格传输安全 (HSTS) 来指定 Firefox 只能安全地连接到它。因此,无法为此证书添加例外。
了解更多…
报告此类错误以帮助 Mozilla 识别和阻止恶意站点
crmpicco.dev 使用无效的安全证书。
该证书不受信任,因为它是自签名的。
错误代码:SEC_ERROR_UNKNOWN_ISSUER
我已将“crmpicco.dev”添加到 security.tls.insecure_fallback_hosts 并将 security.enterprise_roots.enabled 设置为 true,重新启动 Firefox 但这没有任何效果。
我知道 Chrome 有他们的 "badidea"/"thisisnotsafe" 解决方法,我知道这并不理想,但它至少有效 - 而我还没有找到与 Firefox 等效的方法。
解决这个问题的方法是什么?即使我拥有的证书是 2018 年 2 月的,我是否需要生成新的自签名证书。
我在这里尝试了许多问题并且 Mozilla 支持没有效果。
self-signed ×10
ssl ×7
android ×2
apache-camel ×1
browser ×1
certificate ×1
docker ×1
electron ×1
firefox ×1
gitlab ×1
hsts ×1
https ×1
java ×1
javascript ×1
node.js ×1
postman ×1
svn ×1