2011년 맥북에어(MacBookAir4,1)에 Windows 10을 설치했다. 

내가 가지고 있는 맥북에어는 공식적으로 애플에서 Windows 10을 지원하지 않는다. 

결국은 드라이버를 받을 방법이 없어서 조금 고생을 했지만 결국은 설치 완료 했다.

BootCamp 드라이버가 이제는 64 bits만 제공되니 반드시 OS는 x64 버전으로 설치해야 한다.


1. BootCamp 6.x 다운로드 받기

검색해 보니 6.x 버전이 Windows 10을 지원한다고 한다. 

예전에는 애플 홈페이지에서 직접 바이너리를 받았던것 같은데, 6.x 버전은 받을 방법이 없다. 

반드시 OS X의 BootCamp를 통해서만 받을 수 있었다. 


하지만 이미 나는 OS X를 포맷해 버리고 Windows 10을 설치한 터라 준비를 하지 못했다.

이런 경우에 아래 github의 소스를 이용하면 최신 BootCamp 드라이버를 다운받을 수 있다.


URL : https://github.com/timsutton/brigadier


Python이 설치되어 있다면 그냥 스크립트를 실행해서 최신 BootCamp를 받을 수 있다.

※실행하기 위해 pywin32(https://sourceforge.net/projects/pywin32/files/)가 필요하다.


내 맥북에어의 공식 모델명은 MacBookAir4,1인데 이 모델은 Windows 10을 지원하지 않으니 그 다음 버전인 MacBookAir5,1인 것으로 하면 된다.

python brigadier --model=MacBookAir5,1

스크립트 실행이 완료되니깐 BootCamp-031-55710이 다운로드 되어 있다.


2. BootCamp 설치

Setup 파일을 실행하면 "이 Boot Camp 버전은 이 컴퓨터 모델에 적합하지 않습니다." 라는 팝업 다이얼로그가 표시되고 실행되지 않는다.

해결 방법은 https://m.blog.naver.com/PostView.nhn?blogId=macbookcraftsman&logNo=220890183485&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F을 참고하자.


설치방법

  1. Command 창을 관리자 권한으로 실행
  2. 콘솔창에서 cd bootcamp\drivers\apple
  3. 콘솔창에서 msiexec /i bootcamp.msi




저작자 표시 비영리 변경 금지
신고

X.509 Structure


OpenSSL 라이브러리를 이용하여 X.509 포맷의 인증서를 만들고 검사하는 방법에 대해 간략한 샘플 코드를 공개한다.

OpenSSL은 컴파일을 해야 하는데, 이게 좀 귀찮다. 그러니 이미 컴파일된 바이너리를 배포하는 웹사이트를 통해 받아두면 편하다.

컴파일된 바이너리: https://wiki.openssl.org/index.php/Binaries


소스

아래는 OpenSSL을 이용한 X.509 인증서를 만들고 PKCS#12 형태의 전달 가능한 파일로도 변환할 수 있다.

X509.cpp

// X509.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <cstdio>
#include <iostream>

#include <openssl/pem.h>
#include <openssl/x509.h>
#include <openssl/pkcs12.h>
#include <openssl/err.h>

/* Generates a 2048-bit RSA key. */
EVP_PKEY * generate_key()
{
/* Allocate memory for the EVP_PKEY structure. */
EVP_PKEY * pkey = EVP_PKEY_new();
if (!pkey)
{
std::cerr << "Unable to create EVP_PKEY structure." << std::endl;
return NULL;
}
/* Generate the RSA key and assign it to pkey. */
RSA * rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL);
if (!EVP_PKEY_assign_RSA(pkey, rsa))
{
std::cerr << "Unable to generate 2048-bit RSA key." << std::endl;
EVP_PKEY_free(pkey);
return NULL;
}
/* The key has been generated, return it. */
return pkey;
}

/* Generates a self-signed x509 certificate. */
X509 * generate_x509(EVP_PKEY * pkey)
{
/* Allocate memory for the X509 structure. */
X509 * x509 = X509_new();
if (!x509)
{
std::cerr << "Unable to create X509 structure." << std::endl;
return NULL;
}
/* Set the serial number. */
ASN1_INTEGER_set(X509_get_serialNumber(x509), 1);
/* This certificate is valid from now until exactly one year from now. */
X509_gmtime_adj(X509_get_notBefore(x509), 0);
X509_gmtime_adj(X509_get_notAfter(x509), 31536000L);
/* Set the public key for our certificate. */
X509_set_pubkey(x509, pkey);
/* We want to copy the subject name to the issuer name. */
X509_NAME * name = X509_get_subject_name(x509);
/* Set the country code and common name. */
X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)"CA", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, (unsigned char *)"MyCompany", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (unsigned char *)"localhost", -1, -1, 0);
/* Now set the issuer name. */
X509_set_issuer_name(x509, name);
/* Actually sign the certificate with our key. */
if (!X509_sign(x509, pkey, EVP_sha1()))
{
std::cerr << "Error signing certificate." << std::endl;
X509_free(x509);
return NULL;
}
return x509;
}

bool write_to_disk(EVP_PKEY * pkey, X509 * x509)
{
/* Open the PEM file for writing the key to disk. */
FILE * pkey_file = fopen("key.pem", "wb");
if (!pkey_file)
{
std::cerr << "Unable to open \"key.pem\" for writing." << std::endl;
return false;
}
/* Write the key to disk. */
bool ret = PEM_write_PrivateKey(pkey_file, pkey, NULL, NULL, 0, NULL, NULL);
fclose(pkey_file);
if (!ret)
{
std::cerr << "Unable to write private key to disk." << std::endl;
return false;
}
/* Open the PEM file for writing the certificate to disk. */
FILE * x509_file = fopen("cert.pem", "wb");
if (!x509_file)
{
std::cerr << "Unable to open \"cert.pem\" for writing." << std::endl;
return false;
}
/* Write the certificate to disk. */
ret = PEM_write_X509(x509_file, x509);
fclose(x509_file);
if (!ret)
{
std::cerr << "Unable to write certificate to disk." << std::endl;
return false;
}
return true;
}

/* Check the X509 certificate. */
void check_certificate_validaty(X509* certificate)
{
/* a newly initialised X509_STORE_CTX structure */
X509_STORE_CTX *ctx = X509_STORE_CTX_new();

/* a newly initialised X509_STORE structure */
X509_STORE *store = X509_STORE_new();

/* Copy a certificate to X509_STORE structure */
X509_STORE_add_cert(store, certificate);

/* Set up a X509_STORE_CTX for verification. */
X509_STORE_CTX_init(ctx, store, certificate, NULL);

/* Verify a X.509 certification. */
if (X509_verify_cert(ctx) == 1)
{
printf("Certificate verified ok\n");
}
else
{
printf("Certificate verified fail\n");
}
}

bool write_pkcs12()
{
X509 *cert;
PKCS12 *p12;

OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();

/* Allocate memory for the EVP_PKEY structure. */
EVP_PKEY *pkey = EVP_PKEY_new();
if(!pkey)
{
std::cerr << "Unable to create EVP_PKEY structure." << std::endl;
return false;
}

/* Open the PEM file for reading the key on disk. */
FILE *fp = fopen("key.pem", "r");
if (!fp)
{
std::cerr << "Unable to open \"key.pem\" for reading." << std::endl;
return false;
}

/* Read a private key from the PEM file. */
pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
if (!pkey)
{
std::cerr << "Error loading certificate private key content." << std::endl;
return false;
}
fclose(fp);

/* Open the PEM file for reading the certificate on disk. */
fp = fopen("cert.pem", "r");
if (!fp)
{
std::cerr << "Unable to open \"cert.pem\" for reading." << std::endl;
return false;
}

/* Read the X.509 certification from the PEM file. */
cert = PEM_read_X509(fp, NULL, NULL, NULL);
rewind(fp);
fclose(fp);

/* Allocate memory for the PKCS#12 structure. */
p12 = PKCS12_create("PASSWORD", "NAME", pkey, cert, NULL, 0, 0, 0, 0, 0);
if (!p12) {
std::cerr << "Error creating PKCS#12 structure." << std::endl;
return false;
}

/* Open the PEM file for reading the certificate on disk. */
fp = fopen("cert.p12", "wb");
if (!fp)
{
std::cerr << "Unable to open \"cert.p12\" for reading." << std::endl;
return false;
}

/* Write the PKCS#12 certification to disk */
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);

return true;
}

int main(int argc, char ** argv)
{
/* Generate the key. */
std::cout << "Generating RSA key..." << std::endl;
EVP_PKEY * pkey = generate_key();
if(!pkey)
return 1;
/* Generate the certificate. */
std::cout << "Generating x509 certificate..." << std::endl;
X509 * x509 = generate_x509(pkey);
if(!x509)
{
EVP_PKEY_free(pkey);
return 1;
}

check_certificate_validaty(x509);

/* Write the private key and certificate out to disk. */
std::cout << "Writing key and certificate to disk..." << std::endl;
bool ret = write_to_disk(pkey, x509);
EVP_PKEY_free(pkey);
X509_free(x509);
if (ret)
{
std::cout << "Success a writing key and certificate!" << std::endl;
}
else
return 1;

std::cout << "Writing the pkcs#12 certificate to disk..." << std::endl;
ret = write_pkcs12();

if (ret)
{
std::cout << "Success the pkcs#12 certificate!" << std::endl;
return 0;
}
else
return 1;
}


저작자 표시 비영리 변경 금지
신고

WEMOwemo logo


WeMo Light Switches:

  1. Hold down reset until it blinks amber and green
  2. Roughly 30 to 60 seconds in total

WeMo Motion Senors, Switches and Links:

  1. Unplug the WeMo
  2. Hold down the reset button
  3. Plug the WeMo in
  4. Release the reset button a few seconds after it starts flashing amber
  5. Once the WeMo is flashing amber and green the reset is complete

WeMo Bulbs:

  1. Start with bulb on for 5 seconds
  2. Switch bulb off for 5 seconds
  3. Switch bulb on for 5 seconds
  4. Switch bulb off for 5 seconds
  5. Switch bulb on for 5 seconds
  6. Switch bulb off for 5 seconds
  7. Switch bulb on
  8. After 5 seconds the WeMo bulb should blink 3 times and the reset is complete


저작자 표시 비영리 변경 금지
신고

+ Recent posts

티스토리 툴바