Microsoft MVP성태의 닷넷 이야기
사물인터넷: 15. 라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용 [링크 복사], [링크+제목 복사],
조회: 24880
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 11개 있습니다.)

라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용

라즈베리 파이 등의 경우 C++에서 openssl을 사용하려면 다음과 같이 설치하면 됩니다.

sudo apt-get install libssl-dev

그런 다음 Visual Studio의 C++ 프로젝트 속성 창에서 -pthread를 사용했을 때와 유사하게,

Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
; https://www.sysnet.pe.kr/2/0/11373

컴파일 옵션에 직접 다음의 값을 추가합니다.

-lcrypto -lssl

만약 "-lcrypto -lssl" 컴파일 옵션을 주지 않으면 링크 시에 다음과 같이 openssl 관련 함수들을 찾을 수 없다는 오류가 발생합니다.

collect2 : error : ld returned 1 exit status

Error undefined reference to `SSL_read'




웬일인지 NR_OPEN 상수가 정의되지 않았다는 오류가 발생할 수 있습니다.

Error 'NR_OPEN' was not declared in this scope

분명히 limits.h 헤더 파일을 포함시켰고, 헤더 파일 안에는 NR_OPEN 상수가 조건 없이 정의되어 있습니다.

#include <linux/limits.h>

#define NR_OPEN 1024

정확한 원인을 알 수는 없지만 다음과 같이 우회를 했습니다.


#if !defined(_NR_OPEN)
#define NR_OPEN 1024
#endif




참고로, 라즈베리 파이에서 특정 파일을 찾고 싶을 때 다음과 같이 find 명령어를 내리면 됩니다.

sudo find / -name "..."

가령 openssl의 ssl.h 헤더 파일이 리눅스 파일 시스템의 어디에 위치해 있는지 알고 싶다면 다음과 같이 사용할 수 있습니다.

$ sudo find / -name ssl.h
/usr/include/openssl/ssl.h

$ find / -name ssl.h 2>/dev/null

// WSL 환경의 경우 /mnt 디렉터리를 제외하고 싶다면?
$ find / -path /mnt -prune -o -name python 2>/dev/null

윈도우의 경우에는 "dir /a/s ssl.h"라고 하는 것과 유사합니다.




openssl의 초기화 시 인증서와 키 파일의 경로를 지정해야 하는데, 실행 모듈의 경로와 같은 위치에 있는 것을 지정하려고 다음과 같이 사용하면,

int use_cert = SSL_CTX_use_certificate_file(sslContext, "test.pem", SSL_FILETYPE_PEM);
int use_prv = SSL_CTX_use_PrivateKey_file(sslContext, "key.pem", SSL_FILETYPE_PEM);

아래와 같이 해당 실행 모듈이 있는 경로로 이동 후 실행하면 정상적으로 파일을 찾는 반면,

$ cd /share
$ ./test.out

다른 경로에서 직접 실행하게 되면,

$ /share/test.out

test.out과 같은 위치의 파일을 못 찾고 pwd로 출력한 경로를 기준으로 찾게 됩니다. 사실 윈도우에서도 그렇기 때문에 당연한 결과입니다. 따라서 GetModuleFileName과 같은 Win32 API를 사용해 모듈 경로를 직접 구하는 식의 전처리가 필요한데요, 리눅스에서는 "/proc/[pid]/exe"라는 링크를 통해 실행 모듈의 경로를 구할 수 있습니다.

How to find the full path of the C++ Linux program from within?
; https://stackoverflow.com/questions/7051844/how-to-find-the-full-path-of-the-c-linux-program-from-within

[pid]가 아닌 현재 실행되고 있는 프로세스 내에서라면 self 문자열을 사용할 수 있습니다.

/proc/self/exe

다음은 "How to find the full path of the C++ Linux program from within?" 글의 답변을 참고해 작성한 것입니다.

void get_module_dir_path(char modulePath[])
{
    char arg1[] = "/proc/self/exe";
    char exepath[PATH_MAX + 1] = { 0 };

    readlink(arg1, exepath, PATH_MAX);
    strcpy(modulePath, dirname(exepath));

    printf("module path: %s\n", modulePath);
}

암튼, 제가 리눅스 초보자이다 보니 간단한 Win32 API에 상응하는 수준의 것도 저렇게 찾아보게 되는군요. ^^




참고로, 위의 정보를 기반으로 지난번에 만들었던 라즈베리 파이 제로를 위한 가상 USB 키보드/마우스 장치에 SSL 소켓 서버를 구현해 두었습니다. ^^

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠)
; https://www.sysnet.pe.kr/2/0/11369

rasp_vusb 
; https://github.com/stjeong/rasp_vusb



윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법
; https://www.sysnet.pe.kr/2/0/11372

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 이더넷 카드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11353

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11354

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11355

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법
; https://www.sysnet.pe.kr/2/0/11356

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표)
; https://www.sysnet.pe.kr/2/0/11364

Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠)
; https://www.sysnet.pe.kr/2/0/11369

라즈베리 파이 용 C++ 프로젝트에 SSL Socket 적용
; https://www.sysnet.pe.kr/2/0/11411

Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
; https://www.sysnet.pe.kr/2/0/11373

Linux 3: 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정
; https://www.sysnet.pe.kr/2/0/11374


[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/17/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
412정성태12/17/200631822오류 유형: 22. VS.NET 2005 SP1 설치 도중 오류 [9]
411정성태12/16/200620841오류 유형: 21. TFS SP1 설치 관련 오류 (2) - KB919156 패치 이후 TFS 접근 문제
410정성태12/16/200622077오류 유형: 20. TFS SP1 설치 관련 오류 (1) - KB919156 패치
408정성태12/10/200624365Windows: 7. USB 드라이브 내용 암호화
407정성태12/10/200621769오류 유형: 19. Vista 에서의 VS.NET 2005 로 개발한 어셈블리에 대한 서명 확인 오류
406정성태12/10/200626580Windows: 6. IE 7 검색 공급자 - 영한 사전
403정성태12/6/200633743Windows: 5. Vista 와 웹 인증 등록 서비스의 문제 [5]
402정성태12/11/200624723Windows: 4. Vista 설치 후기 [1]
409정성태12/11/200628751    답변글 Windows: 4.1. Vista 설치 후기 - 두 번째 이야기 [3]
396정성태2/13/200731318오류 유형: 18. "Automatic Updates" 서비스 CPU 100% 점유 현상
393정성태11/8/200620900오류 유형: 17. Unable to start debugging - The binding handle is invalid.
371정성태10/23/200620175오류 유형: 16. STS Communication failed.
370정성태11/12/200623982.NET Framework: 75. Windows CardSpace 이야기 (이 글의 내용은 재작성되어질 예정입니다.)
375정성태10/25/200625882    답변글 .NET Framework: 75.1. 개인 발행 카드에 대한 Microsoft 예제 실습(이 글의 내용은 재작성되어질 예정입니다.)
376정성태10/27/200625579    답변글 .NET Framework: 75.2. "Windows CardSpace"와 "인증서 서비스"의 만남(이 글의 내용은 재작성되어질 예정입니다.)
377정성태10/26/200625438    답변글 .NET Framework: 75.3. Managed Card 발행에 대한 Microsoft 예제 실습 (1) - CardWriter (이 글의 내용은 재작성되어질 예정입니다.)
385정성태11/6/200627855    답변글 .NET Framework: 75.4. Managed Card 발행에 대한 Microsoft 예제 실습 (2) - STS 구현 (이 글의 내용은 재작성되어질 예정입니다.) [7]
387정성태11/2/200628741    답변글 .NET Framework: 75.5. Windows CardSpace와 SYSNET 사이트의 만남 (이 글의 내용은 재작성되어질 예정입니다.) [1]
397정성태11/11/200626268    답변글 .NET Framework: 75.6. CardWriter.csproj와 함께 알아보는 인증서 식별 방법(이 글의 내용은 재작성되어질 예정입니다.)
398정성태11/12/200624700    답변글 .NET Framework: 75.7. 카드에 암호 거는 방법(이 글의 내용은 재작성되어질 예정입니다.)
399정성태11/12/200626933    답변글 .NET Framework: 75.8. 인증서/스마트 카드에 기반한 Managed Card - STS 구현(이 글의 내용은 재작성되어질 예정입니다.) [5]
369정성태10/22/200622397오류 유형: 15. 자동 업데이트 실패
367정성태10/22/200638307Windows: 3. IIS 7.0 다중 바인딩 설정하는 방법 [1]
365정성태10/21/200621741Windows: 2. 서버(build 5600)에 IIS 7.0 서비스와 .NET 3.0 설치 방법
359정성태10/17/200617892오류 유형: 14. VS.NET 빌드 오류 - FxCopCmd.exe returned error code 65.
358정성태10/17/200623175오류 유형: 13. WSE 3.0 서비스 관련 WSE101 오류 / Destination Unreachable
... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...