Добавление альтернативного имени субъекта в самозаверяющий сертификат с помощью wincrypt

/* this program will display number in words
for eg. if you enter 101,it will show "ONE HUNDRED AND ONE"*/

import java.util.*;

public class NumToWords {
  String string;
  String st1[] = { "", "one", "two", "three", "four", "five", "six", "seven",
                   "eight", "nine", };
  String st2[] = { "hundred", "thousand", "lakh", "crore" };
  String st3[] = { "ten", "eleven", "twelve", "thirteen", "fourteen",
                   "fifteen", "sixteen", "seventeen", "eighteen", "ninteen", };
  String st4[] = { "twenty", "thirty", "fourty", "fifty", "sixty", "seventy",
                   "eighty", "ninety" };

  public String convert(int number) {
    int n = 1;
    int word;
    string = "";
    while (number != 0) {
      switch (n) {
        case 1:
          word = number % 100;
          pass(word);
          if (number > 100 && number % 100 != 0) {
            show("and ");
            //System.out.print("ankit");
          }
          number /= 100;
          break;
        case 2:
          word = number % 10;
          if (word != 0) {
            show(" ");
            show(st2[0]);
            show(" ");
            pass(word);
          }
          number /= 10;
          break;
        case 3:
          word = number % 100;
          if (word != 0) {
            show(" ");
            show(st2[1]);
            show(" ");
            pass(word);
          }
          number /= 100;
          break;
        case 4:
          word = number % 100;
          if (word != 0) {
            show(" ");
            show(st2[2]);
            show(" ");
            pass(word);
          }
          number /= 100;
          break;
        case 5:
          word = number % 100;
          if (word != 0) {
            show(" ");
            show(st2[3]);
            show(" ");
            pass(word);
          }
          number /= 100;
          break;
        }
        n++;
      }
      return string;
    }

  public void pass(int number) {
    int word, q;
    if (number < 10) {
      show(st1[number]);
    }
    if (number > 9 && number < 20) {
      show(st3[number - 10]);
    }
    if (number > 19) {
      word = number % 10;
      if (word == 0) {
        q = number / 10;
        show(st4[q - 2]);
      } else {
        q = number / 10;
        show(st1[word]);
        show(" ");
        show(st4[q - 2]);
      }
    }
  }

  public void show(String s) {
    String st;
    st = string;
    string = s;
    string += st;
  }

  public static void main(String[] args) {
    NumToWords w = new NumToWords();
    Scanner input = new Scanner(System.in);
    System.out.print("Enter Number: ");
    int num = input.nextInt();
    String inwords = w.convert(num);
    System.out.println(inwords);
  }
}
-1
задан Rem San 1 March 2019 в 06:42
поделиться

1 ответ

Я предполагаю, что ваше построение расширенных данных действительно произошло до вашего звонка в CertCreateSelfSignedCertificate (и, аналогично, ваше построение myBlobdata произошло до его использования).

Основная проблема заключается в том, что вы использовали одну запись SAN (своего рода) в качестве полного расширения SAN; что означало, что вы потеряли некоторые обертки для кодирования. Еще одна проблема заключается в том, что вы использовали szOID_SUBJECT_ALT_NAME, который является неправильным OID для альтернативного имени субъекта ... вы на самом деле хотите szOID_SUBJECT_ALT_NAME2.

Я хочу добавить следующее: DNS-имя = полное доменное имя, DNS-имя = имя хоста и DNS-имя = IP

Добавление IP-адреса в качестве DNS-имени не является -стандарт и должен привести к провалу матча. Вы действительно хотите добавить IP-адрес в качестве записи SAN IP-адреса.

CERT_ALT_NAME_ENTRY entries[3];
entries[0] = { CERT_ALT_NAME_DNS_NAME };
entries[0].pwszDNSName = L"example.org";

// IPv4 Address 10.12.1.130
BYTE ip4Bytes[] = { 10, 12, 1, 130 };
entries[1] = { CERT_ALT_NAME_IP_ADDRESS };
entries[1].IPAddress = { sizeof(ip4Bytes), ip4Bytes };

// ::1, big-endian
BYTE ip6Bytes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
entries[2] = { CERT_ALT_NAME_IP_ADDRESS };
entries[2].IPAddress = { sizeof(ip6Bytes), ip6Bytes };

CERT_NAME_BLOB name = { cbEncoded, buf };
BYTE extBuf[1024] = { 0 };
cbEncoded = sizeof(extBuf);

CERT_ALT_NAME_INFO info = { sizeof(entries) / sizeof(CERT_ALT_NAME_ENTRY), entries };

if (!CryptEncodeObjectEx(
    X509_ASN_ENCODING,
    X509_ALTERNATE_NAME,
    &info,
    0,
    nullptr,
    extBuf,
    &cbEncoded))
{
    // Whatever your error handling story is.
    //
    // Note I didn't do a 0 buffer or CRYPT_ENCODE_ALLOC; I just knew
    // that my buffer would be big enough.
}

CERT_EXTENSION extension = { 0 };
extension.fCritical = 0;
extension.pszObjId = szOID_SUBJECT_ALT_NAME2;
extension.Value = { cbEncoded, extBuf };

CERT_EXTENSIONS extensions = { 1, &extension };

...

PCCERT_CONTEXT cert = CertCreateSelfSignCertificate(
    0,
    &name,
    0,
    &keyProvInfo,
    &sigAlg,
    0,
    &certExpirationDate,
    &extensions);

В CertUI, который дает мне значение альтернативного имени субъекта, я ожидаю:

DNS Name=example.org
IP Address=10.12.1.130
IP Address=0000:0000:0000:0000:0000:0000:0000:0001
0
ответ дан bartonjs 1 March 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: