Chrome যাচাইকৃত অ্যাক্সেস বিকাশকারীর নির্দেশিকা৷

এই গাইড সম্পর্কে

Chrome ভেরিফাইড অ্যাক্সেস API নেটওয়ার্ক পরিষেবাগুলিকে অনুমতি দেয়, যেমন VPN, ইন্ট্রানেট পৃষ্ঠাগুলি এবং আরও অনেক কিছুকে ক্রিপ্টোগ্রাফিকভাবে যাচাই করার জন্য যে তাদের ক্লায়েন্টরা প্রকৃত এবং কর্পোরেট নীতির সাথে সঙ্গতিপূর্ণ। বেশীরভাগ বড় এন্টারপ্রাইজের শুধুমাত্র এন্টারপ্রাইজ-পরিচালিত ডিভাইসগুলিকে তাদের WPA2 EAP-TLS নেটওয়ার্ক, VPN-এ উচ্চ-স্তরের অ্যাক্সেস এবং মিউচুয়াল-TLS ইন্ট্রানেট পৃষ্ঠাগুলিতে অনুমতি দেওয়ার প্রয়োজন রয়েছে। অনেক বিদ্যমান সমাধান একই ক্লায়েন্টের হিউরিস্টিক চেকের উপর নির্ভর করে যা আপস করা হয়েছে। এটি এই চ্যালেঞ্জটি উপস্থাপন করে যে ডিভাইসের বৈধ স্থিতি প্রমাণ করার জন্য যে সংকেতগুলির উপর নির্ভর করা হচ্ছে তা নিজেরাই মিথ্যা হয়ে থাকতে পারে। এই নির্দেশিকাটি ডিভাইসের পরিচয়ের হার্ডওয়্যার-সমর্থিত ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রদান করে এবং এটির অবস্থা অপরিবর্তিত ছিল এবং বুট করার সময় নীতি মেনে চলে; ভেরিফাইড অ্যাক্সেস বলা হয়।

প্রাথমিক শ্রোতা এন্টারপ্রাইজ আইটি ডোমেন প্রশাসক
প্রযুক্তিগত উপাদান ChromeOS, Google যাচাইকৃত অ্যাক্সেস API

যাচাইকৃত অ্যাক্সেসের পূর্বশর্ত

যাচাইকৃত অ্যাক্সেস প্রক্রিয়া বাস্তবায়নের আগে নিম্নলিখিত সেটআপটি সম্পূর্ণ করুন।

API সক্ষম করুন

একটি Google API কনসোল প্রকল্প সেটআপ করুন এবং API সক্ষম করুন:

  1. Google API কনসোলে একটি বিদ্যমান প্রকল্প তৈরি বা ব্যবহার করুন।
  2. সক্ষম APIs এবং পরিষেবা পৃষ্ঠাতে যান৷
  3. Chrome যাচাইকৃত অ্যাক্সেস API সক্ষম করুন৷
  4. Google Cloud API ডকুমেন্টেশন অনুসরণ করে আপনার অ্যাপ্লিকেশনের জন্য একটি API কী তৈরি করুন।

একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন

আপনার চ্যালেঞ্জ-প্রতিক্রিয়া যাচাই করতে ক্রোম ভেরিফাইড অ্যাক্সেস API অ্যাক্সেস করার জন্য নেটওয়ার্ক পরিষেবার জন্য, একটি পরিষেবা অ্যাকাউন্ট এবং একটি পরিষেবা অ্যাকাউন্ট কী তৈরি করুন (আপনাকে একটি নতুন ক্লাউড প্রকল্প তৈরি করতে হবে না, আপনি একইটি ব্যবহার করতে পারেন)৷

একবার আপনি পরিষেবা অ্যাকাউন্ট কী তৈরি করলে, তারপরে আপনার একটি পরিষেবা অ্যাকাউন্ট ব্যক্তিগত কী ফাইল ডাউনলোড করা উচিত। এটি ব্যক্তিগত কীটির একমাত্র অনুলিপি, তাই এটি নিরাপদে সংরক্ষণ করা নিশ্চিত করুন৷

একটি পরিচালিত Chromebook ডিভাইস নথিভুক্ত করুন

আপনার যাচাইকৃত অ্যাক্সেসের জন্য আপনার Chrome এক্সটেনশন সহ একটি সঠিকভাবে পরিচালিত Chromebook ডিভাইস সেটআপ প্রয়োজন৷

  1. এন্টারপ্রাইজ বা শিক্ষা ব্যবস্থাপনার জন্য Chromebook ডিভাইসটি অবশ্যই নথিভুক্ত হতে হবে।
  2. ডিভাইসের ব্যবহারকারীকে অবশ্যই একই ডোমেনের একজন নিবন্ধিত ব্যবহারকারী হতে হবে।
  3. যাচাইকৃত অ্যাক্সেসের জন্য Chrome এক্সটেনশন ডিভাইসে ইনস্টল করা আবশ্যক।
  4. নীতিগুলি যাচাইকৃত অ্যাক্সেস সক্ষম করার জন্য, Chrome এক্সটেনশনের অনুমতি দিতে এবং নেটওয়ার্ক পরিষেবার প্রতিনিধিত্বকারী পরিষেবা অ্যাকাউন্টের জন্য API-তে অ্যাক্সেস মঞ্জুর করার জন্য কনফিগার করা হয়েছে ( Google অ্যাডমিন কনসোল সহায়তা ডকুমেন্টেশন দেখুন)।

ব্যবহারকারী এবং ডিভাইস যাচাই করুন

বিকাশকারীরা ব্যবহারকারী বা ডিভাইস যাচাইকরণের জন্য যাচাইকৃত অ্যাক্সেস ব্যবহার করতে পারেন, অথবা অতিরিক্ত নিরাপত্তার জন্য উভয়ই ব্যবহার করতে পারেন:

  • ডিভাইস যাচাইকরণ —যদি সফল হয়, ডিভাইস যাচাইকরণ একটি গ্যারান্টি প্রদান করে যে Chrome ডিভাইসটি একটি পরিচালিত ডোমেনে নথিভুক্ত করা হয়েছে এবং এটি ডোমেন প্রশাসকের দ্বারা নির্দিষ্ট করা যাচাইকৃত বুট মোড ডিভাইস নীতির সাথে সঙ্গতিপূর্ণ। যদি নেটওয়ার্ক পরিষেবাটিকে ডিভাইসের পরিচয় দেখার অনুমতি দেওয়া হয় ( Google অ্যাডমিন কনসোল সহায়তা ডকুমেন্টেশন দেখুন), তাহলে এটি একটি ডিভাইস আইডিও পায় যা অডিট, ট্র্যাকিং বা ডিরেক্টরি API-কে কল করার জন্য ব্যবহার করা যেতে পারে।

  • ব্যবহারকারী যাচাই —যদি সফল হয়, ব্যবহারকারী যাচাইকরণ একটি গ্যারান্টি প্রদান করে যে একজন সাইন-ইন করা Chrome ব্যবহারকারী একজন পরিচালিত ব্যবহারকারী, একটি নথিভুক্ত ডিভাইস ব্যবহার করছেন এবং ডোমেন প্রশাসকের দ্বারা নির্দিষ্ট করা যাচাইকৃত বুট মোড ব্যবহারকারী নীতির সাথে সঙ্গতিপূর্ণ। যদি নেটওয়ার্ক পরিষেবাটিকে অতিরিক্ত ব্যবহারকারীর ডেটা পাওয়ার অনুমতি দেওয়া হয়, তবে এটি ব্যবহারকারীর দ্বারা জারি করা একটি শংসাপত্র স্বাক্ষর করার অনুরোধও পাবে (সিএসআর স্বাক্ষরিত-পাবলিক-কি-এন্ড-চ্যালেঞ্জ, বা SPKAC, যা কীজেন ফর্ম্যাট নামেও পরিচিত। )

কীভাবে ব্যবহারকারী এবং ডিভাইস যাচাই করবেন

  1. একটি চ্যালেঞ্জ পান — ডিভাইসে থাকা Chrome এক্সটেনশনটি একটি চ্যালেঞ্জ পাওয়ার জন্য যাচাইকৃত অ্যাক্সেস API-এর সাথে যোগাযোগ করে৷ চ্যালেঞ্জ হল একটি অস্বচ্ছ ডেটা স্ট্রাকচার (একটি Google-স্বাক্ষরিত ব্লব) যা 1 মিনিটের জন্য ভাল, যার অর্থ চ্যালেঞ্জ-প্রতিক্রিয়া যাচাইকরণ (ধাপ 3) ব্যর্থ হয় যদি একটি বাসি চ্যালেঞ্জ ব্যবহার করা হয়।

    সবচেয়ে সহজ ব্যবহারের ক্ষেত্রে, ব্যবহারকারী একটি বোতামে ক্লিক করে এই প্রবাহ শুরু করে যা এক্সটেনশন তৈরি করে (এটি Google-প্রদত্ত নমুনা এক্সটেনশনও করে)।

    var apiKey = 'YOUR_API_KEY_HERE';
    var challengeUrlString =
      'https://verifiedaccess.googleapis.com/v2/challenge:generate?key=' + apiKey;
    
    // Request challenge from URL
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('POST', challengeUrlString, true);
    xmlhttp.send();
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4) {
        var challenge = xmlhttp.responseText;
        console.log('challenge: ' + challenge);
        // v2 of the API returns an encoded challenge so no further challenge processing is needed
      }
    };
    

    চ্যালেঞ্জ এনকোড করার জন্য হেল্পার কোড —আপনি যদি API-এর v1 ব্যবহার করেন, তাহলে চ্যালেঞ্জটিকে এনকোড করতে হবে।

    // This can be replaced by using a third-party library such as
    // [https://github.com/dcodeIO/ProtoBuf.js/wiki](https://github.com/dcodeIO/ProtoBuf.js/wiki)
    /**
     * encodeChallenge convert JSON challenge into base64 encoded byte array
     * @param {string} challenge JSON encoded challenge protobuf
     * @return {string} base64 encoded challenge protobuf
     */
    var encodeChallenge = function(challenge) {
      var jsonChallenge = JSON.parse(challenge);
      var challengeData = jsonChallenge.challenge.data;
      var challengeSignature = jsonChallenge.challenge.signature;
    
      var protobufBinary = protoEncodeChallenge(
          window.atob(challengeData), window.atob(challengeSignature));
    
      return window.btoa(protobufBinary);
    };
    
    /**
     * protoEncodeChallenge produce binary encoding of the challenge protobuf
     * @param {string} dataBinary binary data field
     * @param {string} signatureBinary binary signature field
     * @return {string} binary encoded challenge protobuf
     */
    var protoEncodeChallenge = function(dataBinary, signatureBinary) {
      var protoEncoded = '';
    
      // See https://developers.google.com/protocol-buffers/docs/encoding
      // for encoding details.
    
      // 0x0A (00001 010, field number 1, wire type 2 [length-delimited])
      protoEncoded += '\u000A';
    
      // encode length of the data
      protoEncoded += varintEncode(dataBinary.length);
      // add data
      protoEncoded += dataBinary;
    
      // 0x12 (00010 010, field number 2, wire type 2 [length-delimited])
      protoEncoded += '\u0012';
      // encode length of the signature
      protoEncoded += varintEncode(signatureBinary.length);
      // add signature
      protoEncoded += signatureBinary;
    
      return protoEncoded;
    };
    
    /**
     * varintEncode produce binary encoding of the integer number
     * @param {number} number integer number
     * @return {string} binary varint-encoded number
     */
    var varintEncode = function(number) {
      // This only works correctly for numbers 0 through 16383 (0x3FFF)
      if (number <= 127) {
        return String.fromCharCode(number);
      } else {
        return String.fromCharCode(128 + (number & 0x7f), number >>> 7);
      }
    };
    
  2. একটি চ্যালেঞ্জ প্রতিক্রিয়া তৈরি করুন — Chrome এক্সটেনশনটি enterprise.platformKeys Chrome API কল করার জন্য ধাপ 1-এ প্রাপ্ত চ্যালেঞ্জ ব্যবহার করে৷ এটি একটি স্বাক্ষরিত এবং এনক্রিপ্ট করা চ্যালেঞ্জ প্রতিক্রিয়া তৈরি করে, যা এক্সটেনশনটি নেটওয়ার্ক পরিষেবাতে পাঠানো অ্যাক্সেস অনুরোধে অন্তর্ভুক্ত করে।

    এই ধাপে, এক্সটেনশন এবং নেটওয়ার্ক পরিষেবা যোগাযোগের জন্য ব্যবহার করে এমন একটি প্রোটোকল সংজ্ঞায়িত করার কোনো প্রচেষ্টা নেই। এই উভয় সত্তা বহিরাগত বিকাশকারীদের দ্বারা প্রয়োগ করা হয় এবং তারা কীভাবে একে অপরের সাথে কথা বলে তা নির্ধারিত নয়। একটি উদাহরণ হল একটি (URL-এনকোডেড) চ্যালেঞ্জ প্রতিক্রিয়া একটি কোয়েরি স্ট্রিং প্যারামিটার হিসাবে পাঠানো, HTTP POST ব্যবহার করে, বা একটি বিশেষ HTTP শিরোনাম ব্যবহার করে৷

    একটি চ্যালেঞ্জ প্রতিক্রিয়া তৈরি করার জন্য এখানে একটি নমুনা কোড রয়েছে:

    চ্যালেঞ্জ প্রতিক্রিয়া তৈরি করুন

      // Generate challenge response
      var encodedChallenge; // obtained by generate challenge API call
      try {
        if (isDeviceVerification) { // isDeviceVerification set by external logic
          chrome.enterprise.platformKeys.challengeKey(
              {
                scope: 'MACHINE',
                challenge: decodestr2ab(encodedChallenge),
              },
              ChallengeCallback);
        } else {
          chrome.enterprise.platformKeys.challengeKey(
              {
                scope: 'USER',
                challenge: decodestr2ab(encodedChallenge),
                registerKey: { 'RSA' }, // can also specify 'ECDSA'
              },
              ChallengeCallback);
        }
      } catch (error) {
        console.log('ERROR: ' + error);
      }
    

    কলব্যাক ফাংশন চ্যালেঞ্জ

      var ChallengeCallback = function(response) {
        if (chrome.runtime.lastError) {
          console.log(chrome.runtime.lastError.message);
        } else {
          var responseAsString = ab2base64str(response);
          console.log('resp: ' + responseAsString);
        ... // send on to network service
       };
      }
    

    ArrayBuffer রূপান্তর জন্য সাহায্যকারী কোড

      /**
       * ab2base64str convert an ArrayBuffer to base64 string
       * @param {ArrayBuffer} buf ArrayBuffer instance
       * @return {string} base64 encoded string representation
       * of the ArrayBuffer
       */
      var ab2base64str = function(buf) {
        var binary = '';
        var bytes = new Uint8Array(buf);
        var len = bytes.byteLength;
        for (var i = 0; i < len; i++) {
          binary += String.fromCharCode(bytes[i]);
        }
        return window.btoa(binary);
      }
    
      /**
       * decodestr2ab convert a base64 encoded string to ArrayBuffer
       * @param {string} str string instance
       * @return {ArrayBuffer} ArrayBuffer representation of the string
       */
      var decodestr2ab = function(str) {
        var binary_string =  window.atob(str);
        var len = binary_string.length;
        var bytes = new Uint8Array(len);
        for (var i = 0; i < len; i++)        {
            bytes[i] = binary_string.charCodeAt(i);
        }
        return bytes.buffer;
      }
    
  3. চ্যালেঞ্জ প্রতিক্রিয়া যাচাই করুন —কোন ডিভাইস থেকে চ্যালেঞ্জের প্রতিক্রিয়া প্রাপ্তির পরে (সম্ভবত একটি বিদ্যমান প্রমাণীকরণ প্রোটোকলের এক্সটেনশন হিসাবে), ডিভাইসের পরিচয় এবং নীতি ভঙ্গি যাচাই করতে নেটওয়ার্ক পরিষেবাটিকে ভেরিফাইড অ্যাক্সেস API কল করা উচিত (নীচে উদাহরণ কোড দেখুন)। স্পুফিংয়ের বিরুদ্ধে লড়াই করার জন্য, আমরা সুপারিশ করি যে নেটওয়ার্ক পরিষেবাটি যে ক্লায়েন্টের সাথে কথা বলছে তাকে শনাক্ত করে এবং তার অনুরোধে ক্লায়েন্টের প্রত্যাশিত পরিচয় অন্তর্ভুক্ত করে:

    • ডিভাইস যাচাইকরণের জন্য , প্রত্যাশিত ডিভাইস ডোমেন প্রদান করা উচিত। এটি সম্ভবত অনেক ক্ষেত্রে একটি হার্ড-কোডেড মান, কারণ নেটওয়ার্ক পরিষেবা একটি নির্দিষ্ট ডোমেনের জন্য সংস্থানগুলিকে রক্ষা করে৷ এটি সময়ের আগে জানা না থাকলে, ব্যবহারকারীর পরিচয় থেকে এটি অনুমান করা যেতে পারে।
    • ব্যবহারকারী যাচাইয়ের জন্য , প্রত্যাশিত ব্যবহারকারীর ইমেল ঠিকানা প্রদান করা উচিত। আমরা আশা করি নেটওয়ার্ক পরিষেবা তার ব্যবহারকারীদের জানবে (সাধারণত এটি ব্যবহারকারীদের সাইন ইন করতে হবে)।

    যখন Google API কল করা হয়, তখন এটি বেশ কয়েকটি পরীক্ষা করে, যেমন:

    • যাচাই করুন যে চ্যালেঞ্জ প্রতিক্রিয়াটি ChromeOS দ্বারা উত্পাদিত হয়েছে এবং ট্রানজিটে পরিবর্তন করা হয়নি৷
    • ডিভাইস বা ব্যবহারকারী এন্টারপ্রাইজ-পরিচালিত কিনা যাচাই করুন।
    • যাচাই করুন যে ডিভাইস/ব্যবহারকারীর পরিচয় প্রত্যাশিত পরিচয়ের সাথে মেলে (যদি পরবর্তীটি দেওয়া হয়)।
    • যাচাই করুন যে চ্যালেঞ্জে সাড়া দেওয়া হচ্ছে তা নতুন (1 মিনিটের বেশি পুরানো নয়)।
    • ডিভাইস বা ব্যবহারকারী ডোমেন প্রশাসকের দ্বারা নির্দিষ্ট করা নীতির সাথে সঙ্গতিপূর্ণ কিনা তা যাচাই করুন৷
    • কলারকে (নেটওয়ার্ক পরিষেবা) API কল করার অনুমতি দেওয়া হয়েছে তা যাচাই করুন৷
    • যদি কলকারীকে অতিরিক্ত ডিভাইস বা ব্যবহারকারীর ডেটা পাওয়ার অনুমতি দেওয়া হয়, তাহলে প্রতিক্রিয়াতে ডিভাইস আইডি বা ব্যবহারকারীর শংসাপত্র স্বাক্ষর করার অনুরোধ (CSR) অন্তর্ভুক্ত করুন।

    এই উদাহরণ gRPC লাইব্রেরি ব্যবহার করে

    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.auth.oauth2.ServiceAccountCredentials;
    import com.google.chrome.verifiedaccess.v2.VerifiedAccessGrpc;
    import com.google.chrome.verifiedaccess.v2.VerifyChallengeResponseRequest;
    import com.google.chrome.verifiedaccess.v2.VerifyChallengeResponseResult;
    import com.google.protobuf.ByteString;
    
    import io.grpc.ClientInterceptor;
    import io.grpc.ClientInterceptors;
    import io.grpc.ManagedChannel;
    import io.grpc.auth.ClientAuthInterceptor;
    import io.grpc.netty.GrpcSslContexts;
    import io.grpc.netty.NettyChannelBuilder;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Arrays;
    import java.util.concurrent.Executors;
    
    // https://cloud.google.com/storage/docs/authentication#generating-a-private-key
    private final String clientSecretFile = "PATH_TO_GENERATED_JSON_SECRET_FILE";
    
    private ManagedChannel channel;
    private VerifiedAccessGrpc.VerifiedAccessBlockingStub client;
    
    void setup() {
    
       channel = NettyChannelBuilder.forAddress("verifiedaccess.googleapis.com", 443)
          .sslContext(GrpcSslContexts.forClient().ciphers(null).build())
          .build();
    
       List<ClientInterceptor> interceptors = Lists.newArrayList();
       // Attach a credential for my service account and scope it for the API.
       GoogleCredentials credentials =
           ServiceAccountCredentials.class.cast(
               GoogleCredentials.fromStream(
                   new FileInputStream(new File(clientSecretFile))));
      credentials = credentials.createScoped(
          Arrays.<String>asList("https://www.googleapis.com/auth/verifiedaccess"));
      interceptors.add(
           new ClientAuthInterceptor(credentials, Executors.newSingleThreadExecutor()));
    
      // Create a stub bound to the channel with the interceptors applied
      client = VerifiedAccessGrpc.newBlockingStub(
          ClientInterceptors.intercept(channel, interceptors));
    }
    
    /**
     * Invokes the synchronous RPC call that verifies the device response.
     * Returns the result protobuf as a string.
     *
     * @param signedData base64 encoded signedData blob (this is a response from device)
     * @param expectedIdentity expected identity (domain name or user email)
     * @return the verification result protobuf as string
     */
    public String verifyChallengeResponse(String signedData, String expectedIdentity)
      throws IOException, io.grpc.StatusRuntimeException {
      VerifyChallengeResponseResult result =
        client.verifyChallengeResponse(newVerificationRequest(signedData,
            expectedIdentity)); // will throw StatusRuntimeException on error.
    
      return result.toString();
    }
    
    private VerifyChallengeResponseRequest newVerificationRequest(
      String signedData, String expectedIdentity) throws IOException {
      return VerifyChallengeResponseRequest.newBuilder()
        .setChallengeResponse(
            ByteString.copyFrom(BaseEncoding.base64().decode(signedData)))
        .setExpectedIdentity(expectedIdentity == null ? "" : expectedIdentity)
        .build();
    }
    
  4. অ্যাক্সেস মঞ্জুর করুন — এই পদক্ষেপটি নেটওয়ার্ক-পরিষেবা নির্দিষ্ট। এটি একটি প্রস্তাবিত (নির্ধারিত নয়) বাস্তবায়ন। সম্ভাব্য কর্ম হতে পারে:

    • একটি সেশন কুকি তৈরি
    • ব্যবহারকারী বা ডিভাইসের জন্য একটি শংসাপত্র প্রদান করা। সফল ব্যবহারকারী যাচাইকরণের ক্ষেত্রে, এবং ধরে নিই যে নেটওয়ার্ক পরিষেবাটিকে অতিরিক্ত ব্যবহারকারীর ডেটাতে অ্যাক্সেস দেওয়া হয়েছে (গুগল অ্যাডমিন কনসোল নীতির মাধ্যমে), এটি একটি ব্যবহারকারী-স্বাক্ষরিত সিএসআর পায়, যা পরে সার্টিফিকেশন থেকে প্রকৃত শংসাপত্র পেতে ব্যবহার করা যেতে পারে কর্তৃত্ব Microsoft CA-এর সাথে সংহত করার সময়, নেটওয়ার্ক পরিষেবা একটি মধ্যস্থতাকারী হিসাবে কাজ করতে পারে এবং ICertRequest ইন্টারফেস ব্যবহার করতে পারে।

যাচাইকৃত অ্যাক্সেস সহ ক্লায়েন্ট সার্টিফিকেট ব্যবহার করা

যাচাইকৃত অ্যাক্সেস সহ ক্লায়েন্ট সার্টিফিকেট ব্যবহার করা।

একটি বড় প্রতিষ্ঠানে, একাধিক নেটওয়ার্ক পরিষেবা (VPN সার্ভার, Wi-Fi অ্যাক্সেস পয়েন্ট, ফায়ারওয়াল এবং একাধিক ইন্ট্রানেট সাইট) থাকতে পারে যা যাচাইকৃত অ্যাক্সেস থেকে উপকৃত হবে। যাইহোক, এই নেটওয়ার্ক পরিষেবাগুলির প্রতিটিতে পদক্ষেপ 2-4 (উপরের বিভাগে) যুক্তি তৈরি করা ব্যবহারিক নাও হতে পারে। প্রায়শই, এই নেটওয়ার্ক পরিষেবাগুলির অনেকগুলি ইতিমধ্যেই তাদের প্রমাণীকরণের অংশ হিসাবে ক্লায়েন্ট শংসাপত্রের প্রয়োজন করার ক্ষমতা রাখে (উদাহরণস্বরূপ, EAP-TLS বা পারস্পরিক TLS ইন্ট্রানেট পৃষ্ঠাগুলি)। তাই যদি এন্টারপ্রাইজ শংসাপত্র কর্তৃপক্ষ যে এই ক্লায়েন্ট শংসাপত্রগুলি ইস্যু করে তারা পদক্ষেপ 2-4 বাস্তবায়ন করতে পারে এবং চ্যালেঞ্জ-রিসপন্স যাচাইকরণে ক্লায়েন্ট সার্টিফিকেট ইস্যু করার শর্ত দিতে পারে, তাহলে শংসাপত্রের দখল প্রমাণ হতে পারে যে ক্লায়েন্ট আসল এবং এর সাথে সঙ্গতিপূর্ণ কর্পোরেট নীতি। তারপরে প্রতিটি ওয়াই-ফাই অ্যাক্সেস পয়েন্ট, ভিপিএন সার্ভার এবং আরও কিছু পদক্ষেপ 2-4 অনুসরণ করার পরিবর্তে এই ক্লায়েন্ট শংসাপত্রটি পরীক্ষা করতে পারে।

অন্য কথায়, এখানে CA (যা এন্টারপ্রাইজ ডিভাইসে ক্লায়েন্ট সার্টিফিকেট ইস্যু করে) চিত্র 1-এ নেটওয়ার্ক পরিষেবার ভূমিকা নেয়। এটিকে যাচাইকৃত অ্যাক্সেস এপিআই চালু করতে হবে এবং শুধুমাত্র চ্যালেঞ্জ প্রতিক্রিয়া যাচাইকরণ পাস হলেই সার্টিফিকেট প্রদান করবে ক্লায়েন্ট ক্লায়েন্টকে শংসাপত্র প্রদান করা ধাপ 4-এর সমতুল্য - চিত্র 1-এ অ্যাক্সেস মঞ্জুর করুন।

Chromebooks-এ নিরাপদে ক্লায়েন্ট সার্টিফিকেট পাওয়ার প্রক্রিয়া এই নিবন্ধে বর্ণনা করা হয়েছে। যদি এই অনুচ্ছেদে বর্ণিত নকশা অনুসরণ করা হয়, তাহলে যাচাইকৃত অ্যাক্সেস এক্সটেনশন এবং ক্লায়েন্ট সার্টিফিকেট অনবোর্ডিং এক্সটেনশনকে একত্রিত করা যেতে পারে। কিভাবে একটি ক্লায়েন্ট সার্টিফিকেট অনবোর্ডিং এক্সটেনশন লিখতে হয় সে সম্পর্কে আরও জানুন।