아래의 내용을 숙지하신 후에는, 이 글 전체의 내용을 지우고 원하는 글을 작성해주세요.
질문 글을 올리기 전 꼭 읽어주세요
질문을 올리실 때는 답글을 달아주시는 분이 최대한 상황을 자세히 알 수 있도록 질문을 올려주세요. 다음의 내용이 들어가면 좋습니다.
- 무엇을 하고자 하는지
- 현재 작성한 코드 중 문제가 되는 부분
- 기대하는 동작
질문글, 답글, 댓글은 한 번 올리면 언제든 누구나 볼 수 있어야 합니다. 질문글에 대한 답글이 올라왔다고해서 글을 지우는 것은 이기적인 행동입니다. 만약 공개적으로 올릴 수 없는 질문이라면 포럼에는 질문을 올리시면 안됩니다.
한 번 올렸던 질문은 다시 올리지 말아주세요. 만약 질문에 대한 답을 받지 못했다면, 혹시 질문이 너무 추상적이지는 않은지, 단순히 무엇을 대신 해달라는 부탁은 아니었는지 생각해보고 고쳐서 다시 올려주세요. 그리고 먼저 올린 질문에 댓글 형태로 새로운 질문을 계속 추가해주세요. 그래야 추가 답변을 쉽게 받으실 수 있고, 나중에 찾아보기도 좋습니다.
답변을 받으면, 감사의 표시로 꼭 답변 채택 버튼을 눌러 마무리해주세요. 나중에 같은 질문을 찾아보시는 다른 분들께도 도움이 됩니다.
마지막으로 당부드릴 말씀이 있습니다. 질문 답변 게시판에서 답글을 달아주시는 분은 본인의 귀한 시간을 쪼개어 지식을 공유해주시는 분입니다. 답글을 달아주시는 분, 그리고 커뮤니티에 참여하는 다른 모든 분들께 기본적인 예의를 지킬 수 있도록 해주세요.
이상의 내용을 숙지하여 모두가 즐겁게 참여할 수 있는 포럼을 만드는 데 힘을 보태어주세요.
opc ua 통신에서 인증서 보안에서 막혀서 질문을 드립니다.
저는 openssl을 통해서 파일기반의 자체 인증서를 생성했습니다.
(참고 사이트: 윈도우즈에 Openssl 설치하고 인증서 만들기 | 산구루의 IoT 공방)
챗 gpt와 상담을 해가면서 대략적인 완성을 하고, 물어보았을 시에 맨 아래의 xaml.cs코드에서 쳇바퀴를 돌게 되어서 질문 드리게 되었습니다.
코드를 보면 인증서가 유효한지 여부만 확인하고, 인증서 안의 값이 올바르게 매칭이 되었는지를 확인하는 작업은 없는 것 같습니다.
저의 관념상 인증서 안의 값들이 올바르게 매칭이 되었는지, 받은 인증서를 C#코드 내에서 확인하는 코드가 필요하다고 생각합니다.
해당 작업에 대한 코드나 키워드 알려주시면 공부할 수 있도록 하겠습니다.
봐주시고 수정해주시거나 코멘트 주세요 !!
감사합니다.
아래는 제 xaml 쪽 코드입니다.
<Window x:Class="opc_ua.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:opc_ua"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TextBox x:Name="txtOpcDataWrite" TextWrapping="Wrap" Text="TextBlock" Margin="133,66,541,332"/>
<TextBox x:Name="txtOpcDataRead" TextWrapping="Wrap" Text="TextBlock" Margin="133,181,526,217"/>
<Button x:Name="btnOpcWrite" Content="Write" Margin="328,55,355,332"/>
<Button x:Name="btnOpcRead" Content="Read" Margin="386,205,296,178" Click="btnOpcRead_Click"/>
<Button x:Name="btn_cert" Content="cert" Margin="555,316,127,67" Click="btnOpcWrite_Click1"/>
</Grid>
</Window>
구현시 표현되는 이미지는
입니다. ( 코드 내에서 실제로 쓰는 버튼에 해당하는 함수는 btnOpcWrite_Click1 입니다.
btnOpcRead_Click의 함수는 보안작업 없을 경우의 메서드이며, 정상작동됩니다. )
아래는 xaml.cs 쪽 코드입니다.
using Opc.UaFx.Client;
using System.Security.Cryptography.X509Certificates;
using System.Windows;
namespace opc_ua
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private X509Certificate2 LoadCertificate(string certificatePath)
{
return new X509Certificate2(certificatePath);
}
private bool ValidateCertificate(X509Certificate2 certificate)
{
// 인증서의 유효 기간 확인
if (DateTime.Now < certificate.NotBefore || DateTime.Now > certificate.NotAfter)
{
return false;
}
// 필요한 경우, 여기에 추가적인 검증 로직을 추가할 수 있습니다.
// 예: 발급자 확인, 인증서 체인 검증 등
return true;
}
private void btnOpcWrite_Click1(object sender, RoutedEventArgs e)
{
string opcUrl = "opc.tcp://localhost:5519/"; // OPC UA Server Simulator
var certificatePath = @"path\to\your\certificate.crt"; // 인증서 파일 경로
var certificate = LoadCertificate(certificatePath);
if (!ValidateCertificate(certificate))
{
MessageBox.Show("Invalid certificate.");
return;
}
var tagName = "ns=2; s=string_1;";
var client = new OpcClient(opcUrl);
client.Connect();
double temperature = Convert.ToDouble(txtOpcDataWrite.Text);
client.WriteNode(tagName, temperature);
client.Disconnect();
}
private void btnOpcRead_Click(object sender, RoutedEventArgs e) {
string OpcUrl = "opc.tcp://localhost:5519/"; //OPC UA server Simulator
var tagName = "ns=2;s=string_1";
var Client = new OpcClient(OpcUrl);
Client.Connect();
var Temperature = Client.ReadNode(tagName);
txtOpcDataRead.Text = Temperature.ToString();
Client.Disconnect() ;
}
}
}