Jump to content

Можно ли проверить наличие у посетителя сайта корневого сертификата?


Recommended Posts

Posted

Есть сайт, который доступен по HTTP и HTTPS.

Для HTTPS используется самоподписанный сертификат (вернее сертификат, подписанным своим CA).

Хочу чтобы на сайте HTTP была ссылка на сайт HTTPS, в которой было бы написано "Сейчас используется небезопасная версия сайта, рекомендуем перейти на https://site.ru".

Но если посетитель не устанавливал ранее сертификат CA, то он получит предупреждение от браузера.

А можно ли проверить, что у посетителя не установлен сертификат CA, и в этом случае вначале отправить посетителя на страницу с инструкцией по его установке?

Posted

Вариант - из js подгружать с https картинку.

Если подгрузилась - сертификат есть, если не подгрузилось - нету.

Posted

Один из способов - http://ssl_test.gjp.cc

Только надо проверять, как все это работает в разных браузерах

 

Ниработает. :) Даже если туда подставить https://www.google.com/, пишет Failed

Так CORS же.

 

Можете проще сделать

Добавить в код сайта в <header>

<script src="https://site.ru/redirect.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">
   function checkProto(){
       try {
           redirectProto();
       }
       catch(err) {
           //console.log(err)
       }
   }
   checkProto();
</script>

 

redirect.js

function redirectProto() {
   if (window.location.protocol != "https:")
       window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
       //console.log("Not https")
}

Posted
Так CORS же.

 

Я заметил по веб-консоли. :)

 

Можете проще сделать

Добавить в код сайта в <header>

 

В код какого сайта? :) I.e. я не ТС. Хотя, проверить советик можно.

Posted

Но разве это не будет вызывать задержки в загрузке сайта?

Задержка будет только при наличии сертификата во время переадресации.

Чтобы избавиться от повторных редиректов, можно добавить HSTS.

Posted

Подскажите, как правильно сделать?

function checkSSL(url)
{
   var http = new XMLHttpRequest();
   http.open("GET", url, false);
   http.send();
   if (http.readyState==4 && http.status==200)
   {
       return true;
   }
   return false;
}
...
<a onclick="return checkSSL('https://site.ru/empty')" href="https://site.ru">Безопасное подключение</a>

 

Я считал, что при клике на ссылку js-скрипт попытается открыть ресурс https://site.ru/empty (там пустой файл, по ссылке из браузера он открывается).

Если ресурс открылся, то функция возвращает true, клик по ссылке срабатывает и клиент переходит на https.

Если ресурс не открылся (из-за ошибки SSL), то функция возвращает false и клик не срабатывает, вместо него я позже допишу редирект на страницу с инструкцией.

 

Но почему-то так не работает, пользователь всегда переходит на https.

 

Судя по дебагу, функция работает до строки http.send(), после чего браузер переходит по ссылке.

Posted (edited)

Подскажите, как правильно сделать?

function checkSSL(url)
{
   var http = new XMLHttpRequest();
   http.open("GET", url, false);
   http.send();
   if (http.readyState==4 && http.status==200)
   {
       return true;
   }
   return false;
}
...
<a onclick="return checkSSL('https://site.ru/empty')" href="https://site.ru">Безопасное подключение</a>

 

Я считал, что при клике на ссылку js-скрипт попытается открыть ресурс https://site.ru/empty (там пустой файл, по ссылке из браузера он открывается).

Если ресурс открылся, то функция возвращает true, клик по ссылке срабатывает и клиент переходит на https.

Если ресурс не открылся (из-за ошибки SSL), то функция возвращает false и клик не срабатывает, вместо него я позже допишу редирект на страницу с инструкцией.

 

Но почему-то так не работает, пользователь всегда переходит на https.

 

Судя по дебагу, функция работает до строки http.send(), после чего браузер переходит по ссылке.

 

function toHttps() {
//переход по ссылке
}
function checkSSL(url)
{
   var http = new XMLHttpRequest();
   http.open("GET", url, false);
   http.send();
   if (http.readyState==4 && http.status==200)
   {
       toHttps();
   }
   return false;
}
...
<a onclick="return checkSSL('https://site.ru/empty')">Безопасное подключение</a>

 

И по моему запрос XMLHttpRequest(); на другой домен просто так нельзя делать из-за соображений безопасности, нужно обходить.

Edited by m4a12345
Posted

Сложновато.

Тогда уж лучше так, как выше советовали.

Я уже проверил, если SSL не работает, то отбой случается сразу, ждать не надо.

Из дискомфортного только то, что в некоторых браузерах в консоль ошибка сыпется о недоступности js-файла.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.