Jump to content
Калькуляторы

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

Один из способов - 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")
}

Share this post


Link to post
Share on other sites

Так CORS же.

 

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

 

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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(), после чего браузер переходит по ссылке.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Сложновато.

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

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

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

Share this post


Link to post
Share on other sites

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.