A.加密前 wireshark 截圖
首先在RTPS Protocol 欄位會看到Vendor ID代表Prismtech的OpenSplice
也就是說只要查這個ID就知道是PT的DDS傳輸
以RoundTrip sample code為例
封包內是有明碼的Topic Name、Partition Name、Topic Type等等的訊息
(在右圖中)甚至Topic的欄位都看得到 (以EDAQ Scan Device Topic為例)
(在左圖)RoundTrip的範例裡,每次payload都是多個k字母組成
(在右圖)EDAQ Scan Device Topic送出來的IP 及 MAC資料都看得到
也就是說資料本身是string型態的東西,是非常容易被看到的
B.加密後 wireshark 截圖
經過DDSI的加密後,雖然VendorID及Topic 的表頭無法遮掩
但是實際的data內容物是被加密的
下圖為加密後的亂碼,封包長度也有比較長
C.How to enable security in VortexLite
以下動作,reader端/writer端都要做
1.modifyxml file
以roundTrip sample為例
需要在PartitionMappings 裡面去填入partition及topic name (即下面code的ping.RoundTrip 及 pong.RoundTrip)
當VortexLite 在處理資料時 , 會依照mapping去做加解密的動作
在Lite提供aes128、aes192、aes256及blowfish等4種加密方式
< DDSI2E >
< Security >
< SecurityProfile Cipher = "aes128" CipherKey = "ABCDEFABCDEFABCDABCDEFABCDEFABCD" Name = "Security1" />
< SecurityProfile Cipher = "aes128" CipherKey = "ABCDEFABCDEFABCDABCDEFABCDEFABCF" Name = "Security2" />
</ Security >
< Partitioning >
< NetworkPartitions >
< NetworkPartition Address = "224.0.0.1" Name = "part_1" SecurityProfile = "Security1" />
< NetworkPartition Address = "224.0.0.2" Name = "part_2" SecurityProfile = "Security2" />
</ NetworkPartitions >
< PartitionMappings >
< PartitionMapping DCPSPartitionTopic = "ping.RoundTrip" NetworkPartition = "part_1" />
< PartitionMapping DCPSPartitionTopic = "pong.RoundTrip" NetworkPartition = "part_2" />
</ PartitionMappings >
</ Partitioning >
</ DDSI2E >
|
2.install openssl library
sudo apt-get install libssl-dev
|
3.modify source code and rebuild
在呼叫dds_init 之前需先呼叫dds_ssl_plugin
dds_ssl_plugin();
dds_init();
|
Makefile link library 新增dds_ssl及ssl
然後重新make即可
D.How to enable security in VortexOpenSplice
1.modify the xml file
< OpenSplice >
< Domain >
< Name >ospl_shmem_secure_ddsi</ Name >
< Id >0</ Id >
< Description >Federated deployment using shared-memory and extended DDSI networking.</ Description >
< Database >
< Size >10485760</ Size >
</ Database >
< Service name = "ddsi2e" >
< Command >ddsi2e</ Command >
</ Service >
< Service name = "durability" >
< Command >durability</ Command >
</ Service >
< Service name = "cmsoap" >
< Command >cmsoap</ Command >
</ Service >
</ Domain >
< DDSI2EService name = "ddsi2e" >
< General >
< NetworkInterfaceAddress >AUTO</ NetworkInterfaceAddress >
< AllowMulticast >true</ AllowMulticast >
< EnableMulticastLoopback >true</ EnableMulticastLoopback >
< CoexistWithNativeNetworking >false</ CoexistWithNativeNetworking >
</ General >
< Compatibility >
< StandardsConformance >lax</ StandardsConformance >
</ Compatibility >
< Security >
< SecurityProfile Cipher = "blowfish" CipherKey = "ABCDEFABCDEFABCDABCDEFABCDEFABCD" Name = "Security1" />
< SecurityProfile Cipher = "blowfish" CipherKey = "ABCDEFABCDEFABCDABCDEFABCDEFABCF" Name = "Security2" />
</ Security >
< Partitioning >
< NetworkPartitions >
< NetworkPartition Address = "224.0.0.1" Name = "part1" SecurityProfile = "Security1" />
< NetworkPartition Address = "224.0.0.2" Name = "part2" SecurityProfile = "Security2" />
</ NetworkPartitions >
< PartitionMappings >
< PartitionMapping DCPSPartitionTopic = "ping.RoundTrip" NetworkPartition = "part1" />
< PartitionMapping DCPSPartitionTopic = "pong.RoundTrip" NetworkPartition = "part2" />
</ PartitionMappings >
</ Partitioning >
</ DDSI2EService >
< DurabilityService name = "durability" >
< ClientDurability enabled = "true" />
< Network >
< Alignment >
< TimeAlignment >false</ TimeAlignment >
< RequestCombinePeriod >
< Initial >2.5</ Initial >
< Operational >0.1</ Operational >
</ RequestCombinePeriod >
</ Alignment >
< WaitForAttachment maxWaitCount = "100" >
< ServiceName >ddsi2e</ ServiceName >
</ WaitForAttachment >
</ Network >
< NameSpaces >
< NameSpace name = "defaultNamespace" >
< Partition >*</ Partition >
</ NameSpace >
< Policy alignee = "Initial" aligner = "true" durability = "Durable" nameSpace = "defaultNamespace" />
</ NameSpaces >
</ DurabilityService >
< TunerService name = "cmsoap" >
< Server >
< PortNr >50000</ PortNr >
</ Server >
</ TunerService >
</ OpenSplice >
|
2.然後重新開啟ospl及 應用程式就好了
OpenSplice似乎是由daemon去控制的,所以要用shared memory
透過IPC shared 給加密的daemon去加解密,因此code不像Lite需要使用別的API及重新編譯
3.OpenSplice的 DDSI-security 似乎跟 Lite不通...
(可能要問一下PrismTech)
4.OpenSplice還有另一種加密方式是在RTNetworking (參考ospl_shmem_secure_nativeRT.xml)
RTNetworking 是PT自己以UDP建構的protocol,跟DDSI不同
因為RTNetworking只有OpenSplice有支援,不管有沒有加密,若要跟Lite相通就不能使用RTNetworking
E.效能測試
1.roundtrip
目前因為ARM不支援DDS security ,從VM及MXE200i對測來看,latency會增加25~50 us
2.throughput
沒有留言:
張貼留言