2012-07-28 17 views
12

में ब्राउज़र समर्थन मैं अगर ब्राउज़र समर्थन SNI - Server Name Indication पता लगाने में सक्षम होना चाहता हूँ। मैं गैर अनुपालन ग्राहकों को एक अलग पते पर रीडायरेक्ट करने की उम्मीद कर रहा हूं।का पता लगाने के SNI (सर्वर नाम संकेत) जावास्क्रिप्ट

मैं SSL के माध्यम से कुछ सामग्री लोड के बारे में सोच और यकीन है कि यह सुरक्षित रूप से स्थानांतरित किया गया था था। अन्यथा ब्राउज़र एसएनआई का समर्थन नहीं करता है। क्या यह किया जा सकता है?

उत्तर

4

आप एक सर्वर SNI का समर्थन करता है कि, दो मेजबान के नाम की सेवा है, जहां आप SNI की आवश्यकता होती है पर और एक एक fallback समाधान है कि सेट कर सकते हैं, दोनों नाम है कि वे होस्ट कर रहे हैं की सेवा।

की तर्ज पर

कुछ:

  • https://www.example.com/name प्रतिनिधित्व I'm www.example.com
  • https://www.example.net/name रिटर्न I'm www.example.net कह देता है (और SNI आवश्यकता है)।

आप https://www.example.net/name के लिए एक XHR अनुरोध बनाने के लिए और यह www.example.com देता है, तो उसके बाद ब्राउज़र SNI समर्थन नहीं करता।

+0

आपको यह सुनिश्चित करने की ज़रूरत है कि कोई एसएनआई के मामले में, सर्वर www.example.com की रिपोर्ट करेगा। अगर मुझे सही तरीके से याद किया जाता है, तो अपाचे ** पहले ** प्रमाण पत्र परोसता है जब कोई एसएनआई नहीं होता है। – Andreas

+0

हां, यही मेरा मतलब है कि फ़ॉलबैक समाधान: डिफ़ॉल्ट मान। यदि आवश्यक हो, तो आप दोनों से कनेक्ट कर सकते हैं और जो भी प्राप्त करते हैं उसकी तुलना करें। – Bruno

+0

यह एक अच्छा विचार की तरह लगता है। मैं इसका परीक्षण करने जा रहा हूं, यह मेरे लिए काम करेगा। –

0

सभी साइटों के लिए SNI करने के लिए उन्नत commercerack के बाद से हम एक ही मुद्दा था। (उपयोगकर्ता चेकआउट शुरू कर रहे हैं और एक बुरा एसएसएल मुद्दा प्राप्त कर रहे हैं)।

इसे प्रारंभिक बिंदु के रूप में उपयोग करने के लिए स्वतंत्र महसूस करें। ब्राउज़र की सूची बढ़ने के साथ ही मैं अपडेट करूँगा लेकिन यह अभी आईपी + एंड्रॉइड 2.0-2.2 पर आईई करता है। अगर यह क्या चाहते है

https://github.com/brianhorakh/html-sni-useragent-sniffer-warning

+0

लाइन 83 पर बग? अगर (/Android\s2\.[012]+/) {browserSNICompatibility = 0; } ... regex का उपयोग करने के लिए एक स्ट्रिंग var नहीं देखते हैं? –

1

सुनिश्चित नहीं हैं लेकिन वहाँ है इस

RewriteEngine on 

    # Test if SNI will work and if not redirect to too old browser page 
    RewriteCond %{HTTPS} on 
    RewriteCond %{SSL:SSL_TLS_SNI} ="" 
    RewriteRule^http://www.example.com/too-old-browser [L,R=307] 

एक पुराने ब्राउज़र एक साइट है जो SNI तो यह पुनः निर्देशित किया जाएगा (इस मामले में वापस की जरूरत करने के लिए उपयोग करने का प्रयास किया http और एक पृष्ठ कह रहा है कि ब्राउजर बहुत पुराना है)। लेकिन आपको हमेशा एक त्रुटि मिल जाएगी। इसे टाला नहीं जा सकता है। ब्राउजर हैलो आईपी ...., और अपाचे जवाब हैलो यहाँ मेरा प्रमाणपत्र है। यदि ब्राउज़र हैलो अपाचे में एसएनआई की आपूर्ति नहीं करता है तो डिफ़ॉल्ट (यानी गलत) प्रमाण पत्र भेजता है। ब्राउज़र फिर शिकायत करता है।

आप इस https पर अदला-बदली तो आप इनको में कुछ इस तरह डाल सकता है

#Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value 
    SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI} 

और फिर अपने पृष्ठ में तो ब्राउज़र एक https डिफ़ॉल्ट डोमेन से ला नहीं (डिफ़ॉल्ट ऐसा करने से पहले http से लेने के लिए चाहते हैं यह नहीं कहता कि एक सुरक्षा त्रुटि है)। यदि एसएनआई php $ _SERVER ['SSL_TLS_SNI'] में काम कर रहा है, तो डोमेन नाम होगा, अन्यथा इसमें% {SSL: SSL_TLS_SNI} होगा। कोड का यह बिट सुधार किया जा सकता है लेकिन आपको विचार मिलता है।

+0

मुझे नहीं लगता कि ब्राउज़र कभी भी एक एसएसएल हैंडशेक विफल होने पर रीडायरेक्ट को देखेगा, इसलिए मुझे नहीं लगता कि 'SSL_TLS_SNI' चर के आधार पर रीडायरेक्ट काम करेगा। –

1

आप केवल एसएनआई समर्थन पूर्व के लिए इसकी आवश्यकता के लिए परीक्षण कर सकते हैं। यही है, आप उपयोगकर्ताओं को एसएनआई HTTPS पर मजबूर नहीं कर सकते हैं और फिर अगर वे इसका समर्थन नहीं करते हैं तो फॉल-बैक, क्योंकि उन्हें आगे बढ़ने के लिए कोई तरीका नहीं है (विंडोज एक्सपी पर क्रोम से)।

तो (दुर्भाग्य से) उपयोगकर्ता वास्तव में एक असुरक्षित HTTP कनेक्शन पर शुरू करने के लिए और उसके बाद ही अगर वे SNI समर्थन उन्नत किया जा है।अपने सादे HTTP पृष्ठ से

  1. रिमोट स्क्रिप्ट
    , लोड अपने गंतव्य SNI HTTPS सर्वर से एक <script> और स्क्रिप्ट लोड और सही ढंग से चलता है, क्या आप जानते हैं:

    आप के माध्यम से SNI समर्थन का पता लगा सकते ब्राउज़र एसएनआई का समर्थन करता है।

  2. क्रॉस-डोमेन AJAX (CORS)
    विकल्प 1 के समान, आप HTTPS करने के लिए HTTP पेज से एक क्रॉस-डोमेन AJAX अनुरोध प्रदर्शन की कोशिश कर सकते हैं, लेकिन ध्यान रखें CORS only limited browser support है कि हो सकता है।

  3. उपयोगकर्ता-एजेंट सूंघ
    यह शायद कम से कम विश्वसनीय तरीका है, और आप इसे समर्थन करने के लिए नहीं है, या ज्ञात की एक श्वेत सूची में जाना जाता ब्राउज़रों (और ऑपरेटिंग सिस्टम) की एक काली सूची होने के बीच तय करने की आवश्यकता होगी सिस्टम जो करते हैं।

    हम जानते हैं कि आईई के सभी संस्करण, क्रोम & विंडोज एक्सपी पर ओपेरा और नीचे एसएनआई का समर्थन नहीं करते हैं। CanIUse.com for full list of supported browsers देखें।

संबंधित मुद्दे