Microsoft MVP성태의 닷넷 이야기
사물인터넷: 15. 라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용 [링크 복사], [링크+제목 복사],
조회: 24876
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11109정성태11/17/201623066.NET Framework: 625. ASP.NET에서 System.Web.HttpApplication 인스턴스는 다중으로 생성됩니다.
11108정성태11/13/201622131.NET Framework: 624. WPF - Line 요소를 Canvas에 위치시켰을 때 흐림(blur) 현상파일 다운로드1
11107정성태11/9/201626453오류 유형: 371. Post cache substitution is not compatible with modules in the IIS integrated pipeline that modify the response buffers.파일 다운로드1
11106정성태11/8/201626679.NET Framework: 623. C# - PeerFinder를 이용한 Wi-Fi Direct 데이터 통신 예제 [2]파일 다운로드1
11105정성태11/8/201621165.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제
11104정성태11/8/201620027개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제
11103정성태11/8/201620542오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생
11102정성태11/8/201620604오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생
11101정성태11/8/201622808.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363
11100정성태11/7/201630425개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]
11099정성태11/7/201632316.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드파일 다운로드1
11098정성태11/7/201621562오류 유형: 368. 빌드 이벤트에서 robocopy 사용 시 $(TargetDir) 매크로를 지정하는 경우 오류 발생
11097정성태11/7/201624594오류 유형: 367. go install: no install location for directory [...경로...] outside GOPATH
11096정성태11/6/201628013디버깅 기술: 83. PDB 파일을 수동으로 다운로드하는 방법
11095정성태11/6/201624685.NET Framework: 619. C# - Cognitive Services 중의 하나인 Face API를 사용해 얼굴 인식 및 흐림(blur) 효과 적용 [1]파일 다운로드1
11094정성태11/5/201626355VC++: 105. Visual Studio 2013/2015 - Ceemple OpenCV 확장을 이용한 웹캠 영상 출력
11093정성태11/4/201626234웹: 34. Edge 브라우저도 지원하는 클립보드 복사를 위한 자바스크립트 코드
11092정성태11/3/201633302.NET Framework: 618. C# - NAudio를 이용한 MP3 파일 재생 [5]파일 다운로드1
11091정성태11/3/201627109VC++: 104. std::call_once를 이용해 thread-safe한 Singleton 객체 생성파일 다운로드1
11090정성태11/1/201628639VC++: 103. C++ CreateTimerQueue, CreateTimerQueueTimer 예제 코드 [9]파일 다운로드1
11089정성태11/1/201628455디버깅 기술: 82. Windows 10을 위한 Symbol(PDB) 파일 내려받는 방법 [2]
11088정성태11/1/201631650.NET Framework: 617. C# - AForge.NET을 이용한 MP4 동영상 파일 재생 [7]파일 다운로드1
11087정성태11/1/201625942.NET Framework: 616. AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법파일 다운로드1
11086정성태11/1/201620342오류 유형: 366. The Microsoft Passport Container service terminated with the following error: General access denied error
11085정성태10/27/201635143.NET Framework: 615. C# - AForge.NET을 이용한 웹캠 영상 출력 [2]파일 다운로드1
11084정성태10/26/201622902오류 유형: 365. The User Profile Service service failed to the sign-in.
... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...