Браузерное хранилище доверия представляет собой совокупность корневых сертификатов (Root CA), предустановленных в системе или самом браузере. Эти сертификаты используются для проверки цепочек доверия при установлении защищённых соединений (TLS/SSL). Библиотека Jsrsasign не имеет прямого доступа к системному хранилищу доверия браузера, однако позволяет реализовать аналогичную модель проверки сертификатов на уровне JavaScript.
В условиях браузера ключевая задача — эмуляция процесса верификации цепочки сертификатов с использованием заранее известных доверенных корневых сертификатов.
Jsrsasign функционирует полностью в пользовательском пространстве JavaScript, без доступа к:
Это означает:
При этом библиотека предоставляет инструменты для:
Вместо системного хранилища используется собственный список доверенных сертификатов.
Чаще всего используются:
Пример PEM-корневого сертификата:
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEbmh5...
-----END CERTIFICATE-----
const trustedCerts = [
`-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----`
];
Каждый сертификат может быть преобразован в объект:
const x509 = new X509();
x509.readCertPEM(trustedCerts[0]);
Процесс включает:
const certChain = [
serverCertPEM,
intermediateCertPEM,
rootCertPEM
];
Каждый сертификат подписан вышестоящим центром сертификации.
const child = new X509();
child.readCertPEM(serverCertPEM);
const parent = new X509();
parent.readCertPEM(intermediateCertPEM);
const isValid = child.verifySignature(parent.getPublicKey());
Проверка выполняется для каждого уровня цепочки.
Полная проверка включает:
function verifyChain(chain, trustedRoots) {
for (let i = 0; i < chain.length - 1; i++) {
const cert = new X509();
cert.readCertPEM(chain[i]);
const issuer = new X509();
issuer.readCertPEM(chain[i + 1]);
if (!cert.verifySignature(issuer.getPublicKey())) {
return false;
}
}
const root = chain[chain.length - 1];
return trustedRoots.includes(root);
}
Каждый сертификат содержит поля:
const x509 = new X509();
x509.readCertPEM(certPEM);
const now = new Date();
const notBefore = x509.getNotBefore();
const notAfter = x509.getNotAfter();
const validTime = now >= new Date(notBefore) && now <= new Date(notAfter);
Сертификат должен соответствовать доменному имени.
Извлекаются:
const subject = x509.getSubjectString();
SAN:
const san = x509.getExtSubjectAltName();
Сравнение:
Jsrsasign часто используется совместно с:
Однако проверка TLS уже выполняется браузером. Jsrsasign применяется для:
Сертификаты могут загружаться:
fetch('/certs/root.pem')
.then(res => res.text())
.then(pem => {
trustedCerts.push(pem);
});
Для повышения производительности используется:
Пример:
localStorage.setItem('trustedCerts', JSON.stringify(trustedCerts));
Загрузка:
const stored = JSON.parse(localStorage.getItem('trustedCerts'));
Проблема устаревших сертификатов решается:
Можно импортировать:
Формат — PEM список:
const mozillaBundle = `-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----`;
Jsrsasign позволяет анализировать расширения:
const ext = x509.getExtBasicConstraints();
Проверяется:
Реализуются проверки:
Включение в список доверенных:
trustedCerts.push(selfSignedCertPEM);
Проверка:
cert.verifySignature(cert.getPublicKey());
Проблемы:
Оптимизация:
Jsrsasign может использовать WebCrypto для:
Однако интеграция требует ручной реализации.
В одностраничных приложениях:
Риски:
Решения:
Рекомендуется разделять:
Jsrsasign работает с:
Конвертация:
const hex = pemtohex(pem);
Система может быть дополнена:
Библиотека не заменяет встроенную TLS-проверку браузера, а дополняет её: